@bikdotai/bik-component-library 0.0.868 → 0.0.869-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/cjs/components/bik-copilot/ControlledCopilot.js +1 -1
  2. package/dist/cjs/components/bik-copilot/ControlledCopilot.js.map +1 -1
  3. package/dist/cjs/components/bik-copilot/CopilotPanel.js +1 -1
  4. package/dist/cjs/components/bik-copilot/CopilotPanel.js.map +1 -1
  5. package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js +53 -12
  6. package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js.map +1 -1
  7. package/dist/cjs/components/bik-copilot/copilotSelectionPrompt.js +2 -0
  8. package/dist/cjs/components/bik-copilot/copilotSelectionPrompt.js.map +1 -0
  9. package/dist/cjs/components/text-selection-ask/SelectionAskPill.js +2 -0
  10. package/dist/cjs/components/text-selection-ask/SelectionAskPill.js.map +1 -0
  11. package/dist/cjs/components/text-selection-ask/SelectionAskPill.styled.js +32 -0
  12. package/dist/cjs/components/text-selection-ask/SelectionAskPill.styled.js.map +1 -0
  13. package/dist/cjs/components/text-selection-ask/TextSelectionAsk.js +2 -0
  14. package/dist/cjs/components/text-selection-ask/TextSelectionAsk.js.map +1 -0
  15. package/dist/cjs/components/text-selection-ask/model.js +2 -0
  16. package/dist/cjs/components/text-selection-ask/model.js.map +1 -0
  17. package/dist/cjs/components/text-selection-ask/selectionText.js +2 -0
  18. package/dist/cjs/components/text-selection-ask/selectionText.js.map +1 -0
  19. package/dist/cjs/components/text-selection-ask/useTextSelectionAsk.js +2 -0
  20. package/dist/cjs/components/text-selection-ask/useTextSelectionAsk.js.map +1 -0
  21. package/dist/cjs/icons/Informational/Common UI/SquaresFour.js +2 -0
  22. package/dist/cjs/icons/Informational/Common UI/SquaresFour.js.map +1 -0
  23. package/dist/cjs/icons/index.js +1 -1
  24. package/dist/cjs/index.js +1 -1
  25. package/dist/esm/components/bik-copilot/ControlledCopilot.js +34 -30
  26. package/dist/esm/components/bik-copilot/ControlledCopilot.js.map +1 -1
  27. package/dist/esm/components/bik-copilot/CopilotPanel.js +261 -237
  28. package/dist/esm/components/bik-copilot/CopilotPanel.js.map +1 -1
  29. package/dist/esm/components/bik-copilot/CopilotPanel.styled.d.ts +8 -0
  30. package/dist/esm/components/bik-copilot/CopilotPanel.styled.js +69 -25
  31. package/dist/esm/components/bik-copilot/CopilotPanel.styled.js.map +1 -1
  32. package/dist/esm/components/bik-copilot/copilotSelectionPrompt.d.ts +13 -0
  33. package/dist/esm/components/bik-copilot/copilotSelectionPrompt.js +8 -0
  34. package/dist/esm/components/bik-copilot/copilotSelectionPrompt.js.map +1 -0
  35. package/dist/esm/components/bik-copilot/model.d.ts +19 -0
  36. package/dist/esm/components/text-selection-ask/SelectionAskPill.d.ts +22 -0
  37. package/dist/esm/components/text-selection-ask/SelectionAskPill.js +44 -0
  38. package/dist/esm/components/text-selection-ask/SelectionAskPill.js.map +1 -0
  39. package/dist/esm/components/text-selection-ask/SelectionAskPill.styled.d.ts +5 -0
  40. package/dist/esm/components/text-selection-ask/SelectionAskPill.styled.js +37 -0
  41. package/dist/esm/components/text-selection-ask/SelectionAskPill.styled.js.map +1 -0
  42. package/dist/esm/components/text-selection-ask/TextSelectionAsk.d.ts +36 -0
  43. package/dist/esm/components/text-selection-ask/TextSelectionAsk.js +69 -0
  44. package/dist/esm/components/text-selection-ask/TextSelectionAsk.js.map +1 -0
  45. package/dist/esm/components/text-selection-ask/index.d.ts +7 -0
  46. package/dist/esm/components/text-selection-ask/model.d.ts +112 -0
  47. package/dist/esm/components/text-selection-ask/model.js +7 -0
  48. package/dist/esm/components/text-selection-ask/model.js.map +1 -0
  49. package/dist/esm/components/text-selection-ask/selectionText.d.ts +18 -0
  50. package/dist/esm/components/text-selection-ask/selectionText.js +7 -0
  51. package/dist/esm/components/text-selection-ask/selectionText.js.map +1 -0
  52. package/dist/esm/components/text-selection-ask/useTextSelectionAsk.d.ts +15 -0
  53. package/dist/esm/components/text-selection-ask/useTextSelectionAsk.js +53 -0
  54. package/dist/esm/components/text-selection-ask/useTextSelectionAsk.js.map +1 -0
  55. package/dist/esm/icons/Informational/Common UI/SquaresFour.d.ts +7 -0
  56. package/dist/esm/icons/Informational/Common UI/SquaresFour.js +33 -0
  57. package/dist/esm/icons/Informational/Common UI/SquaresFour.js.map +1 -0
  58. package/dist/esm/icons/Informational/Common UI/index.d.ts +1 -0
  59. package/dist/esm/icons/index.d.ts +1 -1
  60. package/dist/esm/icons/index.js +158 -156
  61. package/dist/esm/icons/index.js.map +1 -1
  62. package/dist/esm/index.d.ts +1 -0
  63. package/dist/esm/index.js +403 -388
  64. package/dist/esm/index.js.map +1 -1
  65. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),n=require("react"),ge=require("../../constants/Theme.js"),Ce=require("./ControlledCopilot.styled.js"),v=require("./CopilotBall.js"),me=require("./CopilotPanel.js"),he=require("./copilotPlacement.js"),ve=require("./useDraggableFloater.js"),Pe=({messages:P,onSendMessage:b,isThinking:w=!1,thinkingLabel:L,isStreaming:q=!1,onStop:E,interruptedLabel:k,followUpsLabel:y,hasMoreHistory:T=!1,isLoadingHistory:j=!1,onLoadOlderMessages:O,historyLoadingLabel:R,errorMessage:$,ballSize:s=56,corner:x="bottom-right",offset:B=24,initialPosition:D,draggable:u=!0,snapToEdge:I=!0,onPositionChange:F,ballIcon:S,ballOpenIcon:_,ballColor:A=ge.COLORS.background.brand,zIndex:d=1200,ballAriaLabel:U,panelWidth:z=400,panelHeight:H=700,panelGap:K=12,title:M="Copilot",badge:G,subtitle:J,avatar:N,placeholder:Q,disclaimer:V,emptyStateTitle:W,emptyStateSubtitle:X,suggestions:Y,onSuggestionClick:Z,showRefresh:ee=!0,onRefresh:te,onRegenerate:oe,onFeedback:ne,inputDisabled:re=!1,open:f,defaultOpen:le=!1,onOpenChange:p,closeOnClickOutside:g=!1,className:se,style:ie})=>{const[ae,ce]=n.useState(le),C=n.useRef(null),i=f!==void 0,e=i?f:ae,o=n.useCallback(t=>{i||ce(t),p?.(t)},[i,p]),{position:m,isDragging:ue,viewport:de,dragHandlers:fe,shouldIgnoreClick:h}=ve.useDraggableFloater({size:s,corner:x,offset:B,enabled:u,snapToEdge:I,initialPosition:D,onPositionChange:F}),pe=n.useCallback(()=>{h()||o(!e)},[e,o,h]);n.useEffect(()=>{if(!e)return;const t=a=>{a.key==="Escape"&&o(!1)};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[e,o]),n.useEffect(()=>{if(!e||!g)return;const t=a=>{const c=a.target;c&&(C.current?.contains(c)||c.closest(`[${v.COPILOT_BALL_ATTRIBUTE}]`)||o(!1))};return document.addEventListener("pointerdown",t),()=>document.removeEventListener("pointerdown",t)},[g,e,o]);const l=he.getCopilotPanelPlacement({ballPosition:m,ballSize:s,panelWidth:z,panelHeight:H,gap:K,viewport:de});return r.jsxs(r.Fragment,{children:[e&&r.jsx(Ce.PanelPositioner,{ref:C,$left:l.left,$top:l.top,$width:l.width,$height:l.height,$zIndex:d,children:r.jsx(me.CopilotPanel,{messages:P,onSend:b,onClose:()=>o(!1),title:M,badge:G,subtitle:J,avatar:N,placeholder:Q,disclaimer:V,emptyStateTitle:W,emptyStateSubtitle:X,suggestions:Y,onSuggestionClick:Z,showRefresh:ee,onRefresh:te,onRegenerate:oe,onFeedback:ne,isThinking:w,thinkingLabel:L,isStreaming:q,onStop:E,interruptedLabel:k,followUpsLabel:y,hasMoreHistory:T,isLoadingHistory:j,onLoadOlderMessages:O,historyLoadingLabel:R,inputDisabled:re,errorMessage:$,className:se,style:ie})}),r.jsx(v.CopilotBall,{isOpen:e,onToggle:pe,position:m,size:s,isDragging:ue,draggable:u,color:A,zIndex:d+1,icon:S,openIcon:_,ariaLabel:U,...fe})]})};exports.ControlledCopilot=Pe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),n=require("react"),me=require("../../constants/Theme.js"),he=require("./ControlledCopilot.styled.js"),v=require("./CopilotBall.js"),ve=require("./CopilotPanel.js"),Pe=require("./copilotPlacement.js"),be=require("./useDraggableFloater.js"),we=({messages:P,onSendMessage:b,isThinking:w=!1,thinkingLabel:L,isStreaming:q=!1,onStop:E,interruptedLabel:k,followUpsLabel:y,hasMoreHistory:T=!1,isLoadingHistory:j=!1,onLoadOlderMessages:O,historyLoadingLabel:R,errorMessage:$,ballSize:s=56,corner:x="bottom-right",offset:B=24,initialPosition:D,draggable:u=!0,snapToEdge:I=!0,onPositionChange:F,ballIcon:S,ballOpenIcon:_,ballColor:A=me.COLORS.background.brand,zIndex:d=1200,ballAriaLabel:U,panelWidth:z=400,panelHeight:H=700,panelGap:K=12,title:M="Copilot",badge:G,subtitle:J,avatar:N,placeholder:Q,disclaimer:V,emptyStateTitle:W,emptyStateSubtitle:X,suggestions:Y,onSuggestionClick:Z,showRefresh:ee=!0,onRefresh:te,onRegenerate:oe,onFeedback:ne,inputDisabled:re=!1,attachment:le,onAttachmentRemove:se,open:f,defaultOpen:ie=!1,onOpenChange:p,closeOnClickOutside:g=!1,className:ae,style:ce})=>{const[ue,de]=n.useState(ie),C=n.useRef(null),i=f!==void 0,e=i?f:ue,o=n.useCallback(t=>{i||de(t),p?.(t)},[i,p]),{position:m,isDragging:fe,viewport:pe,dragHandlers:ge,shouldIgnoreClick:h}=be.useDraggableFloater({size:s,corner:x,offset:B,enabled:u,snapToEdge:I,initialPosition:D,onPositionChange:F}),Ce=n.useCallback(()=>{h()||o(!e)},[e,o,h]);n.useEffect(()=>{if(!e)return;const t=a=>{a.key==="Escape"&&o(!1)};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[e,o]),n.useEffect(()=>{if(!e||!g)return;const t=a=>{const c=a.target;c&&(C.current?.contains(c)||c.closest(`[${v.COPILOT_BALL_ATTRIBUTE}]`)||o(!1))};return document.addEventListener("pointerdown",t),()=>document.removeEventListener("pointerdown",t)},[g,e,o]);const l=Pe.getCopilotPanelPlacement({ballPosition:m,ballSize:s,panelWidth:z,panelHeight:H,gap:K,viewport:pe});return r.jsxs(r.Fragment,{children:[e&&r.jsx(he.PanelPositioner,{ref:C,$left:l.left,$top:l.top,$width:l.width,$height:l.height,$zIndex:d,children:r.jsx(ve.CopilotPanel,{messages:P,onSend:b,onClose:()=>o(!1),title:M,badge:G,subtitle:J,avatar:N,placeholder:Q,disclaimer:V,emptyStateTitle:W,emptyStateSubtitle:X,suggestions:Y,onSuggestionClick:Z,showRefresh:ee,onRefresh:te,onRegenerate:oe,onFeedback:ne,isThinking:w,thinkingLabel:L,isStreaming:q,onStop:E,interruptedLabel:k,followUpsLabel:y,hasMoreHistory:T,isLoadingHistory:j,onLoadOlderMessages:O,historyLoadingLabel:R,inputDisabled:re,attachment:le,onAttachmentRemove:se,errorMessage:$,className:ae,style:ce})}),r.jsx(v.CopilotBall,{isOpen:e,onToggle:Ce,position:m,size:s,isDragging:fe,draggable:u,color:A,zIndex:d+1,icon:S,openIcon:_,ariaLabel:U,...ge})]})};exports.ControlledCopilot=we;
2
2
  //# sourceMappingURL=ControlledCopilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ControlledCopilot.js","sources":["../../../../src/components/bik-copilot/ControlledCopilot.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { COLORS } from '@src/constants/Theme';\nimport { PanelPositioner } from './ControlledCopilot.styled';\nimport { COPILOT_BALL_ATTRIBUTE, CopilotBall } from './CopilotBall';\nimport { CopilotPanel } from './CopilotPanel';\nimport { getCopilotPanelPlacement } from './copilotPlacement';\nimport { ControlledCopilotProps } from './model';\nimport { useDraggableFloater } from './useDraggableFloater';\n\n/**\n * The presentational half of the copilot: a draggable floating ball that opens a\n * chat panel beside it.\n *\n * Fully controlled — it renders the `messages` it is handed and reports every\n * user action through callbacks, so it carries no backend knowledge. **Use\n * `BIKCopilot` instead** unless you are wiring a backend other than\n * `/bik-ai/copilot-bikchatbot`; `BIKCopilot` is this component plus the streaming\n * transport, IndexedDB history and route-aware ice breakers.\n */\nexport const ControlledCopilot: React.FC<ControlledCopilotProps> = ({\n\t// Conversation\n\tmessages,\n\tonSendMessage,\n\tisThinking = false,\n\tthinkingLabel,\n\tisStreaming = false,\n\tonStop,\n\tinterruptedLabel,\n\tfollowUpsLabel,\n\thasMoreHistory = false,\n\tisLoadingHistory = false,\n\tonLoadOlderMessages,\n\thistoryLoadingLabel,\n\terrorMessage,\n\t// Ball\n\tballSize = 56,\n\tcorner = 'bottom-right',\n\toffset = 24,\n\tinitialPosition,\n\tdraggable = true,\n\tsnapToEdge = true,\n\tonPositionChange,\n\tballIcon,\n\tballOpenIcon,\n\tballColor = COLORS.background.brand,\n\tzIndex = 1200,\n\tballAriaLabel,\n\t// Panel\n\tpanelWidth = 400,\n\tpanelHeight = 700,\n\tpanelGap = 12,\n\ttitle = 'Copilot',\n\tbadge,\n\tsubtitle,\n\tavatar,\n\tplaceholder,\n\tdisclaimer,\n\temptyStateTitle,\n\temptyStateSubtitle,\n\tsuggestions,\n\tonSuggestionClick,\n\tshowRefresh = true,\n\tonRefresh,\n\tonRegenerate,\n\tonFeedback,\n\tinputDisabled = false,\n\t// Open state\n\topen,\n\tdefaultOpen = false,\n\tonOpenChange,\n\tcloseOnClickOutside = false,\n\tclassName,\n\tstyle,\n}) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\tconst panelRef = useRef<HTMLDivElement>(null);\n\n\tconst isControlled = open !== undefined;\n\tconst isOpen = isControlled ? open : uncontrolledOpen;\n\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetUncontrolledOpen(next);\n\t\t\t}\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange],\n\t);\n\n\tconst { position, isDragging, viewport, dragHandlers, shouldIgnoreClick } =\n\t\tuseDraggableFloater({\n\t\t\tsize: ballSize,\n\t\t\tcorner,\n\t\t\toffset,\n\t\t\tenabled: draggable,\n\t\t\tsnapToEdge,\n\t\t\tinitialPosition,\n\t\t\tonPositionChange,\n\t\t});\n\n\tconst handleBallClick = useCallback(() => {\n\t\t// The click that ends a drag gesture must not toggle the panel.\n\t\tif (shouldIgnoreClick()) {\n\t\t\treturn;\n\t\t}\n\t\tsetOpen(!isOpen);\n\t}, [isOpen, setOpen, shouldIgnoreClick]);\n\n\t// Escape closes the panel.\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [isOpen, setOpen]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnClickOutside) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (panelRef.current?.contains(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target.closest(`[${COPILOT_BALL_ATTRIBUTE}]`)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetOpen(false);\n\t\t};\n\t\tdocument.addEventListener('pointerdown', handlePointerDown);\n\t\treturn () => document.removeEventListener('pointerdown', handlePointerDown);\n\t}, [closeOnClickOutside, isOpen, setOpen]);\n\n\tconst placement = getCopilotPanelPlacement({\n\t\tballPosition: position,\n\t\tballSize,\n\t\tpanelWidth,\n\t\tpanelHeight,\n\t\tgap: panelGap,\n\t\tviewport,\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{isOpen && (\n\t\t\t\t<PanelPositioner\n\t\t\t\t\tref={panelRef}\n\t\t\t\t\t$left={placement.left}\n\t\t\t\t\t$top={placement.top}\n\t\t\t\t\t$width={placement.width}\n\t\t\t\t\t$height={placement.height}\n\t\t\t\t\t$zIndex={zIndex}\n\t\t\t\t>\n\t\t\t\t\t<CopilotPanel\n\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\tonSend={onSendMessage}\n\t\t\t\t\t\tonClose={() => setOpen(false)}\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tbadge={badge}\n\t\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\t\tavatar={avatar}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdisclaimer={disclaimer}\n\t\t\t\t\t\temptyStateTitle={emptyStateTitle}\n\t\t\t\t\t\temptyStateSubtitle={emptyStateSubtitle}\n\t\t\t\t\t\tsuggestions={suggestions}\n\t\t\t\t\t\tonSuggestionClick={onSuggestionClick}\n\t\t\t\t\t\tshowRefresh={showRefresh}\n\t\t\t\t\t\tonRefresh={onRefresh}\n\t\t\t\t\t\tonRegenerate={onRegenerate}\n\t\t\t\t\t\tonFeedback={onFeedback}\n\t\t\t\t\t\tisThinking={isThinking}\n\t\t\t\t\t\tthinkingLabel={thinkingLabel}\n\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\tonStop={onStop}\n\t\t\t\t\t\tinterruptedLabel={interruptedLabel}\n\t\t\t\t\t\tfollowUpsLabel={followUpsLabel}\n\t\t\t\t\t\thasMoreHistory={hasMoreHistory}\n\t\t\t\t\t\tisLoadingHistory={isLoadingHistory}\n\t\t\t\t\t\tonLoadOlderMessages={onLoadOlderMessages}\n\t\t\t\t\t\thistoryLoadingLabel={historyLoadingLabel}\n\t\t\t\t\t\tinputDisabled={inputDisabled}\n\t\t\t\t\t\terrorMessage={errorMessage}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t/>\n\t\t\t\t</PanelPositioner>\n\t\t\t)}\n\n\t\t\t<CopilotBall\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonToggle={handleBallClick}\n\t\t\t\tposition={position}\n\t\t\t\tsize={ballSize}\n\t\t\t\tisDragging={isDragging}\n\t\t\t\tdraggable={draggable}\n\t\t\t\tcolor={ballColor}\n\t\t\t\tzIndex={zIndex + 1}\n\t\t\t\ticon={ballIcon}\n\t\t\t\topenIcon={ballOpenIcon}\n\t\t\t\tariaLabel={ballAriaLabel}\n\t\t\t\t{...dragHandlers}\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nexport default ControlledCopilot;\n"],"names":["ControlledCopilot","messages","onSendMessage","isThinking","thinkingLabel","isStreaming","onStop","interruptedLabel","followUpsLabel","hasMoreHistory","isLoadingHistory","onLoadOlderMessages","historyLoadingLabel","errorMessage","ballSize","corner","offset","initialPosition","draggable","snapToEdge","onPositionChange","ballIcon","ballOpenIcon","ballColor","COLORS","zIndex","ballAriaLabel","panelWidth","panelHeight","panelGap","title","badge","subtitle","avatar","placeholder","disclaimer","emptyStateTitle","emptyStateSubtitle","suggestions","onSuggestionClick","showRefresh","onRefresh","onRegenerate","onFeedback","inputDisabled","open","defaultOpen","onOpenChange","closeOnClickOutside","className","style","uncontrolledOpen","setUncontrolledOpen","useState","panelRef","useRef","isControlled","isOpen","setOpen","useCallback","next","position","isDragging","viewport","dragHandlers","shouldIgnoreClick","useDraggableFloater","handleBallClick","useEffect","handleKeyDown","event","handlePointerDown","target","COPILOT_BALL_ATTRIBUTE","placement","getCopilotPanelPlacement","jsxs","Fragment","jsx","PanelPositioner","CopilotPanel","CopilotBall"],"mappings":"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"}
1
+ {"version":3,"file":"ControlledCopilot.js","sources":["../../../../src/components/bik-copilot/ControlledCopilot.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { COLORS } from '@src/constants/Theme';\nimport { PanelPositioner } from './ControlledCopilot.styled';\nimport { COPILOT_BALL_ATTRIBUTE, CopilotBall } from './CopilotBall';\nimport { CopilotPanel } from './CopilotPanel';\nimport { getCopilotPanelPlacement } from './copilotPlacement';\nimport { ControlledCopilotProps } from './model';\nimport { useDraggableFloater } from './useDraggableFloater';\n\n/**\n * The presentational half of the copilot: a draggable floating ball that opens a\n * chat panel beside it.\n *\n * Fully controlled — it renders the `messages` it is handed and reports every\n * user action through callbacks, so it carries no backend knowledge. **Use\n * `BIKCopilot` instead** unless you are wiring a backend other than\n * `/bik-ai/copilot-bikchatbot`; `BIKCopilot` is this component plus the streaming\n * transport, IndexedDB history and route-aware ice breakers.\n */\nexport const ControlledCopilot: React.FC<ControlledCopilotProps> = ({\n\t// Conversation\n\tmessages,\n\tonSendMessage,\n\tisThinking = false,\n\tthinkingLabel,\n\tisStreaming = false,\n\tonStop,\n\tinterruptedLabel,\n\tfollowUpsLabel,\n\thasMoreHistory = false,\n\tisLoadingHistory = false,\n\tonLoadOlderMessages,\n\thistoryLoadingLabel,\n\terrorMessage,\n\t// Ball\n\tballSize = 56,\n\tcorner = 'bottom-right',\n\toffset = 24,\n\tinitialPosition,\n\tdraggable = true,\n\tsnapToEdge = true,\n\tonPositionChange,\n\tballIcon,\n\tballOpenIcon,\n\tballColor = COLORS.background.brand,\n\tzIndex = 1200,\n\tballAriaLabel,\n\t// Panel\n\tpanelWidth = 400,\n\tpanelHeight = 700,\n\tpanelGap = 12,\n\ttitle = 'Copilot',\n\tbadge,\n\tsubtitle,\n\tavatar,\n\tplaceholder,\n\tdisclaimer,\n\temptyStateTitle,\n\temptyStateSubtitle,\n\tsuggestions,\n\tonSuggestionClick,\n\tshowRefresh = true,\n\tonRefresh,\n\tonRegenerate,\n\tonFeedback,\n\tinputDisabled = false,\n\tattachment,\n\tonAttachmentRemove,\n\t// Open state\n\topen,\n\tdefaultOpen = false,\n\tonOpenChange,\n\tcloseOnClickOutside = false,\n\tclassName,\n\tstyle,\n}) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\tconst panelRef = useRef<HTMLDivElement>(null);\n\n\tconst isControlled = open !== undefined;\n\tconst isOpen = isControlled ? open : uncontrolledOpen;\n\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetUncontrolledOpen(next);\n\t\t\t}\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange],\n\t);\n\n\tconst { position, isDragging, viewport, dragHandlers, shouldIgnoreClick } =\n\t\tuseDraggableFloater({\n\t\t\tsize: ballSize,\n\t\t\tcorner,\n\t\t\toffset,\n\t\t\tenabled: draggable,\n\t\t\tsnapToEdge,\n\t\t\tinitialPosition,\n\t\t\tonPositionChange,\n\t\t});\n\n\tconst handleBallClick = useCallback(() => {\n\t\t// The click that ends a drag gesture must not toggle the panel.\n\t\tif (shouldIgnoreClick()) {\n\t\t\treturn;\n\t\t}\n\t\tsetOpen(!isOpen);\n\t}, [isOpen, setOpen, shouldIgnoreClick]);\n\n\t// Escape closes the panel.\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [isOpen, setOpen]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnClickOutside) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (panelRef.current?.contains(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target.closest(`[${COPILOT_BALL_ATTRIBUTE}]`)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetOpen(false);\n\t\t};\n\t\tdocument.addEventListener('pointerdown', handlePointerDown);\n\t\treturn () => document.removeEventListener('pointerdown', handlePointerDown);\n\t}, [closeOnClickOutside, isOpen, setOpen]);\n\n\tconst placement = getCopilotPanelPlacement({\n\t\tballPosition: position,\n\t\tballSize,\n\t\tpanelWidth,\n\t\tpanelHeight,\n\t\tgap: panelGap,\n\t\tviewport,\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{isOpen && (\n\t\t\t\t<PanelPositioner\n\t\t\t\t\tref={panelRef}\n\t\t\t\t\t$left={placement.left}\n\t\t\t\t\t$top={placement.top}\n\t\t\t\t\t$width={placement.width}\n\t\t\t\t\t$height={placement.height}\n\t\t\t\t\t$zIndex={zIndex}\n\t\t\t\t>\n\t\t\t\t\t<CopilotPanel\n\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\tonSend={onSendMessage}\n\t\t\t\t\t\tonClose={() => setOpen(false)}\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tbadge={badge}\n\t\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\t\tavatar={avatar}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdisclaimer={disclaimer}\n\t\t\t\t\t\temptyStateTitle={emptyStateTitle}\n\t\t\t\t\t\temptyStateSubtitle={emptyStateSubtitle}\n\t\t\t\t\t\tsuggestions={suggestions}\n\t\t\t\t\t\tonSuggestionClick={onSuggestionClick}\n\t\t\t\t\t\tshowRefresh={showRefresh}\n\t\t\t\t\t\tonRefresh={onRefresh}\n\t\t\t\t\t\tonRegenerate={onRegenerate}\n\t\t\t\t\t\tonFeedback={onFeedback}\n\t\t\t\t\t\tisThinking={isThinking}\n\t\t\t\t\t\tthinkingLabel={thinkingLabel}\n\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\tonStop={onStop}\n\t\t\t\t\t\tinterruptedLabel={interruptedLabel}\n\t\t\t\t\t\tfollowUpsLabel={followUpsLabel}\n\t\t\t\t\t\thasMoreHistory={hasMoreHistory}\n\t\t\t\t\t\tisLoadingHistory={isLoadingHistory}\n\t\t\t\t\t\tonLoadOlderMessages={onLoadOlderMessages}\n\t\t\t\t\t\thistoryLoadingLabel={historyLoadingLabel}\n\t\t\t\t\t\tinputDisabled={inputDisabled}\n\t\t\t\t\t\tattachment={attachment}\n\t\t\t\t\t\tonAttachmentRemove={onAttachmentRemove}\n\t\t\t\t\t\terrorMessage={errorMessage}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t/>\n\t\t\t\t</PanelPositioner>\n\t\t\t)}\n\n\t\t\t<CopilotBall\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonToggle={handleBallClick}\n\t\t\t\tposition={position}\n\t\t\t\tsize={ballSize}\n\t\t\t\tisDragging={isDragging}\n\t\t\t\tdraggable={draggable}\n\t\t\t\tcolor={ballColor}\n\t\t\t\tzIndex={zIndex + 1}\n\t\t\t\ticon={ballIcon}\n\t\t\t\topenIcon={ballOpenIcon}\n\t\t\t\tariaLabel={ballAriaLabel}\n\t\t\t\t{...dragHandlers}\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nexport default ControlledCopilot;\n"],"names":["ControlledCopilot","messages","onSendMessage","isThinking","thinkingLabel","isStreaming","onStop","interruptedLabel","followUpsLabel","hasMoreHistory","isLoadingHistory","onLoadOlderMessages","historyLoadingLabel","errorMessage","ballSize","corner","offset","initialPosition","draggable","snapToEdge","onPositionChange","ballIcon","ballOpenIcon","ballColor","COLORS","zIndex","ballAriaLabel","panelWidth","panelHeight","panelGap","title","badge","subtitle","avatar","placeholder","disclaimer","emptyStateTitle","emptyStateSubtitle","suggestions","onSuggestionClick","showRefresh","onRefresh","onRegenerate","onFeedback","inputDisabled","attachment","onAttachmentRemove","open","defaultOpen","onOpenChange","closeOnClickOutside","className","style","uncontrolledOpen","setUncontrolledOpen","useState","panelRef","useRef","isControlled","isOpen","setOpen","useCallback","next","position","isDragging","viewport","dragHandlers","shouldIgnoreClick","useDraggableFloater","handleBallClick","useEffect","handleKeyDown","event","handlePointerDown","target","COPILOT_BALL_ATTRIBUTE","placement","getCopilotPanelPlacement","jsxs","Fragment","jsx","PanelPositioner","CopilotPanel","CopilotBall"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),He=require("../../assets/icons/arrow_down.svg.js"),b=require("../../assets/icons/bik_ai_stars_icon.svg.js"),Pe=require("../../assets/icons/cross.svg.js"),Ee=require("../../assets/icons/refresh.svg.js"),i=require("react"),x=require("../../constants/Theme.js"),g=require("../TypographyStyle.js"),Fe=require("./CopilotFeedbackModal.js"),o=require("./CopilotPanel.styled.js"),Oe=require("./copilotRegenerate.js"),qe=require("./utils/markdown.js"),We=require("./utils/toolCtas.js"),ne=require("../dot-pulse/DotPulse.js"),Ne=r=>r&&typeof r=="object"&&"default"in r?r:{default:r},$e=Ne(i),De=96,Ue=24,Ve=1800,Ke=async r=>{try{if(navigator.clipboard?.writeText)return await navigator.clipboard.writeText(r),!0}catch{}try{const l=document.createElement("textarea");l.value=r,l.setAttribute("readonly",""),l.style.position="fixed",l.style.top="-1000px",l.style.opacity="0",document.body.appendChild(l),l.select();const T=document.execCommand("copy");return document.body.removeChild(l),T}catch{return!1}},Xe=48,Ge=r=>{if(!r||!Number.isFinite(r))return"";const l=new Date(r);return Number.isNaN(l.getTime())?"":l.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit"})},ze=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M12 19V5"}),e.jsx("path",{d:"M6 11l6-6 6 6"})]}),Je=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M5 12h14"}),e.jsx("path",{d:"M13 6l6 6-6 6"})]}),ie=({size:r=16})=>e.jsx("svg",{viewBox:"0 0 24 24",width:r,height:r,fill:"currentColor","aria-hidden":"true",children:e.jsx("rect",{x:"7",y:"7",width:"10",height:"10",rx:"2"})}),Ze=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("rect",{x:"9",y:"9",width:"11",height:"11",rx:"2"}),e.jsx("path",{d:"M15 5.5A1.5 1.5 0 0 0 13.5 4H5.5A1.5 1.5 0 0 0 4 5.5v8A1.5 1.5 0 0 0 5.5 15"})]}),Qe=()=>e.jsx("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:"M5 13l4 4L19 7"})}),Ye=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M20 12a8 8 0 1 1-2.34-5.66"}),e.jsx("path",{d:"M20 4v4h-4"})]}),et=({filled:r=!1})=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:r?"currentColor":"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M7 10v11H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h3Z"}),e.jsx("path",{d:"M7 10l4.5-7a2 2 0 0 1 3.7 1.3L14.5 9H19a2 2 0 0 1 2 2.3l-1.1 7A2 2 0 0 1 18 20H7"})]}),tt=({filled:r=!1})=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:r?"currentColor":"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M7 14V3H4a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3Z"}),e.jsx("path",{d:"M7 14l4.5 7a2 2 0 0 0 3.7-1.3L14.5 15H19a2 2 0 0 0 2-2.3l-1.1-7A2 2 0 0 0 18 4H7"})]}),ot=({messages:r,onSend:l,onClose:T,title:j="Copilot",badge:F,subtitle:O,avatar:le,placeholder:se="Write your message...",disclaimer:q="AI can make mistakes, Verify the responses.",emptyStateTitle:ce,emptyStateSubtitle:W="Here are some things you can try",suggestions:v,onSuggestionClick:ae,showRefresh:de=!0,onRefresh:N,onRegenerate:$,onFeedback:S,dislikeTitle:he,dislikeSubtitle:ue,dislikeReasons:pe,dislikeNotePlaceholder:xe,dislikeSubmitLabel:je,isThinking:f=!1,thinkingLabel:D="Thinking",isStreaming:fe=!1,onStop:U,interruptedLabel:V="This message was interrupted",followUpsLabel:K="Follow ups",onToolCtaClick:ke,hasMoreHistory:Ce=!1,isLoadingHistory:k=!1,onLoadOlderMessages:X,historyLoadingLabel:we="Loading earlier messages",inputDisabled:a=!1,errorMessage:G,width:ye,height:be,className:ge,style:Te})=>{const[M,z]=i.useState(""),[ve,J]=i.useState(!1),[L,R]=i.useState(!0),[C,Z]=i.useState(null),[h,Se]=i.useState({}),[w,A]=i.useState(null),Q=i.useRef(null),u=i.useRef(null),I=i.useRef(null),m=i.useRef(null),B=i.useRef(0),_=i.useRef(null),y=r.filter(t=>(t.content.length>0||t.wasInterrupted)&&!Oe.isCopilotRegeneratePrompt(t.content)),Y=y.length===0&&!f,d=f||fe,ee=!a&&!d&&M.trim().length>0,p=d&&!!U,H=y[y.length-1],P=!d&&H?.role==="assistant"?H.followUps:void 0,E=!Y&&!L;i.useEffect(()=>{L&&I.current?.scrollIntoView({behavior:"smooth"})},[r,f,L]),i.useEffect(()=>{const t=m.current,n=_.current;!t||n===null||k||(_.current=null,t.scrollTop=t.scrollHeight-n,B.current=t.scrollTop)},[r,k]);const Me=()=>{const t=m.current;if(!t)return;const n=t.scrollHeight-t.scrollTop-t.clientHeight;t.scrollTop<=Xe&&Ce&&!k&&X&&(_.current=t.scrollHeight-t.scrollTop,X());const c=t.scrollTop<B.current-1;if(B.current=t.scrollTop,n<=Ue){R(!0);return}c&&R(!1)},Le=()=>{R(!0),I.current?.scrollIntoView({behavior:"smooth"})};i.useEffect(()=>()=>{u.current&&window.clearTimeout(u.current)},[]);const Re=async t=>{await Ke(t.content)&&(u.current&&window.clearTimeout(u.current),Z(t.id),u.current=window.setTimeout(()=>Z(null),Ve))},te=(t,n)=>{const c=h[t]===n;if(Se(s=>({...s,[t]:s[t]===n?void 0:n})),c){n==="dislike"&&A(s=>s===t?null:s);return}if(n==="like"){S?.(t,"like");return}w&&w!==t&&S?.(w,"dislike"),A(t)},oe=(t,n)=>{A(c=>c===t?null:c),S?.(t,"dislike",n)},Ae=()=>{a||d||$?.()},re=()=>{const t=M.trim();if(!t||a||d)return;l(t),z("");const n=Q.current;n&&(n.style.height="auto")},Ie=t=>{z(t.target.value);const n=t.target;n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,De)}px`},me=t=>{t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),re())},Be=t=>{a||d||(ae?.(t),l(t.text))},_e=t=>{a||d||l(t)};return e.jsxs(o.PanelContainer,{className:ge,style:{width:ye,height:be,...Te},role:"dialog","aria-label":j,children:[e.jsxs(o.PanelHeader,{children:[e.jsx(o.HeaderAvatar,{children:le??e.jsx(b.default,{width:18,height:18})}),e.jsxs(o.HeaderText,{children:[e.jsxs(o.HeaderTitleRow,{children:[e.jsx(g.TitleSmall,{children:j}),F&&e.jsx(o.HeaderBadge,{children:F})]}),O&&e.jsx(g.BodyCaption,{color:x.COLORS.content.secondary,children:O})]}),e.jsxs(o.HeaderActions,{children:[de&&N&&e.jsx(o.IconAction,{type:"button",onClick:N,"aria-label":"Start a new conversation",children:e.jsx(Ee.default,{width:16,height:16})}),e.jsx(o.IconAction,{type:"button",onClick:T,"aria-label":"Close copilot",children:e.jsx(Pe.default,{width:18,height:18})})]})]}),e.jsxs(o.MessagesViewport,{children:[e.jsx(o.MessagesArea,{ref:m,onScroll:Me,role:"region","aria-label":"Conversation",children:Y?e.jsxs(o.EmptyState,{children:[e.jsx(o.EmptyStateIcon,{children:e.jsx(b.default,{width:28,height:28})}),e.jsx(g.BodySecondary,{style:{fontWeight:600},children:ce||j}),W&&e.jsx(g.BodyCaption,{color:x.COLORS.content.secondary,children:W}),v&&v.length>0&&e.jsx(o.SuggestionList,{children:v.map(t=>e.jsxs(o.SuggestionChip,{type:"button",disabled:a||d,onClick:()=>Be(t),children:[e.jsx(b.default,{width:14,height:14}),t.text]},t.id))})]}):e.jsxs(e.Fragment,{children:[k&&e.jsxs(o.HistoryLoader,{role:"status","aria-live":"polite",children:[e.jsx(ne.DotPulse,{color:x.COLORS.content.placeholder,size:4}),we]}),y.map(t=>{const n=t.role==="user"?Ge(t.timestamp):"";return e.jsxs($e.default.Fragment,{children:[t.content.length>0&&e.jsx(o.MessageBubble,{$role:t.role,children:t.role==="assistant"?e.jsx("div",{dangerouslySetInnerHTML:{__html:qe.renderCopilotMarkdown(t.content)}}):e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.content})}),t.role==="assistant"&&!t.isStreaming&&(()=>{const c=We.toolResultCtas(t.toolResults);return c.length===0?null:e.jsx(o.ToolCtaList,{children:c.map(s=>e.jsx(o.ToolCtaLink,{href:s.url,target:"_blank",rel:"noopener noreferrer",onClick:()=>ke?.({tool:s.tool,url:s.url}),children:s.label},`${s.tool}-${s.url}`))})})(),n&&e.jsx(o.MessageTimestamp,{children:n}),t.wasInterrupted&&V&&e.jsxs(o.InterruptedNote,{children:[e.jsx(ie,{size:12}),V]}),t.role==="assistant"&&t.content.length>0&&!t.isStreaming&&e.jsxs(o.MessageActions,{children:[e.jsx(o.MessageAction,{type:"button",onClick:()=>{Re(t)},"data-copied":C===t.id,title:C===t.id?"Copied":"Copy","aria-label":C===t.id?"Response copied to clipboard":"Copy response",children:C===t.id?e.jsx(Qe,{}):e.jsx(Ze,{})}),$&&t.id===H?.id&&e.jsx(o.MessageAction,{type:"button",onClick:Ae,disabled:a||d,title:"Regenerate","aria-label":"Regenerate response",children:e.jsx(Ye,{})}),e.jsx(o.MessageAction,{type:"button",onClick:()=>te(t.id,"like"),"data-selected":h[t.id]==="like","aria-pressed":h[t.id]==="like",title:"Good response","aria-label":"Good response",children:e.jsx(et,{filled:h[t.id]==="like"})}),e.jsx(o.MessageAction,{type:"button",onClick:()=>te(t.id,"dislike"),"data-selected":h[t.id]==="dislike","aria-pressed":h[t.id]==="dislike",title:"Bad response","aria-label":"Bad response",children:e.jsx(tt,{filled:h[t.id]==="dislike"})})]}),w===t.id&&e.jsx(Fe.CopilotFeedbackModal,{title:he,subtitle:ue??`Help us improve ${j}`,reasons:pe,notePlaceholder:xe,submitLabel:je,onSubmit:c=>oe(t.id,c),onDismiss:()=>oe(t.id)})]},t.id)}),P&&P.length>0&&e.jsxs(o.FollowUpList,{children:[K&&e.jsx(o.FollowUpsLabel,{children:K}),P.map(t=>e.jsxs(o.FollowUpChip,{type:"button",disabled:a,onClick:()=>_e(t),children:[e.jsx(Je,{}),t]},t))]}),f&&e.jsxs(o.ThinkingBubble,{role:"status","aria-live":"polite",children:[e.jsx(b.default,{width:14,height:14,color:x.COLORS.content.brand}),D&&e.jsx(o.ThinkingLabel,{children:D}),e.jsx(ne.DotPulse,{color:x.COLORS.background.brand,size:5})]}),e.jsx("div",{ref:I})]})}),e.jsx(o.ScrollFade,{$visible:E,"aria-hidden":"true"}),e.jsx(o.JumpToLatestButton,{type:"button",$visible:E,onClick:Le,tabIndex:E?0:-1,"aria-label":"Scroll to the latest message",children:e.jsx(He.default,{width:16,height:16})})]}),G&&e.jsx(o.ErrorBanner,{role:"alert",children:G}),e.jsx(o.InputArea,{children:e.jsxs(o.InputWrapper,{$focused:ve,children:[e.jsx(o.MessageInput,{ref:Q,rows:1,value:M,placeholder:se,disabled:a,onChange:Ie,onKeyDown:me,onFocus:()=>J(!0),onBlur:()=>J(!1)}),e.jsx(o.SendButton,{type:"button",$active:p||ee,disabled:!p&&!ee,onClick:p?U:re,"aria-label":p?"Stop generating":"Send message",children:p?e.jsx(ie,{}):e.jsx(ze,{})})]})}),q&&e.jsx(o.Disclaimer,{children:q})]})};exports.CopilotPanel=ot;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),Fe=require("../../assets/icons/arrow_down.svg.js"),f=require("../../assets/icons/bik_ai_stars_icon.svg.js"),le=require("../../assets/icons/cross.svg.js"),Oe=require("../../assets/icons/refresh.svg.js"),i=require("react"),p=require("../../constants/Theme.js"),T=require("../TypographyStyle.js"),qe=require("./CopilotFeedbackModal.js"),o=require("./CopilotPanel.styled.js"),We=require("./copilotRegenerate.js"),Ne=require("./copilotSelectionPrompt.js"),$e=require("./utils/markdown.js"),De=require("./utils/toolCtas.js"),se=require("../dot-pulse/DotPulse.js"),Ue=r=>r&&typeof r=="object"&&"default"in r?r:{default:r},Ve=Ue(i),Ke=96,Xe=24,Ge=1800,ze=async r=>{try{if(navigator.clipboard?.writeText)return await navigator.clipboard.writeText(r),!0}catch{}try{const l=document.createElement("textarea");l.value=r,l.setAttribute("readonly",""),l.style.position="fixed",l.style.top="-1000px",l.style.opacity="0",document.body.appendChild(l),l.select();const S=document.execCommand("copy");return document.body.removeChild(l),S}catch{return!1}},Je=48,Ze=r=>{if(!r||!Number.isFinite(r))return"";const l=new Date(r);return Number.isNaN(l.getTime())?"":l.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit"})},Qe=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M12 19V5"}),e.jsx("path",{d:"M6 11l6-6 6 6"})]}),Ye=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M5 12h14"}),e.jsx("path",{d:"M13 6l6 6-6 6"})]}),ce=({size:r=16})=>e.jsx("svg",{viewBox:"0 0 24 24",width:r,height:r,fill:"currentColor","aria-hidden":"true",children:e.jsx("rect",{x:"7",y:"7",width:"10",height:"10",rx:"2"})}),et=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("rect",{x:"9",y:"9",width:"11",height:"11",rx:"2"}),e.jsx("path",{d:"M15 5.5A1.5 1.5 0 0 0 13.5 4H5.5A1.5 1.5 0 0 0 4 5.5v8A1.5 1.5 0 0 0 5.5 15"})]}),tt=()=>e.jsx("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:"M5 13l4 4L19 7"})}),ot=()=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M20 12a8 8 0 1 1-2.34-5.66"}),e.jsx("path",{d:"M20 4v4h-4"})]}),rt=({filled:r=!1})=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:r?"currentColor":"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M7 10v11H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h3Z"}),e.jsx("path",{d:"M7 10l4.5-7a2 2 0 0 1 3.7 1.3L14.5 9H19a2 2 0 0 1 2 2.3l-1.1 7A2 2 0 0 1 18 20H7"})]}),nt=({filled:r=!1})=>e.jsxs("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:r?"currentColor":"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M7 14V3H4a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3Z"}),e.jsx("path",{d:"M7 14l4.5 7a2 2 0 0 0 3.7-1.3L14.5 15H19a2 2 0 0 0 2-2.3l-1.1-7A2 2 0 0 0 18 4H7"})]}),it=({messages:r,onSend:l,onClose:S,title:k="Copilot",badge:q,subtitle:W,avatar:de,placeholder:ae="Write your message...",disclaimer:N="AI can make mistakes, Verify the responses.",emptyStateTitle:he,emptyStateSubtitle:$="Here are some things you can try",suggestions:v,onSuggestionClick:ue,showRefresh:pe=!0,onRefresh:D,onRegenerate:U,onFeedback:M,dislikeTitle:xe,dislikeSubtitle:je,dislikeReasons:fe,dislikeNotePlaceholder:ke,dislikeSubmitLabel:Ce,isThinking:C=!1,thinkingLabel:V="Thinking",isStreaming:we=!1,onStop:K,interruptedLabel:X="This message was interrupted",followUpsLabel:G="Follow ups",onToolCtaClick:ye,hasMoreHistory:be=!1,isLoadingHistory:w=!1,onLoadOlderMessages:z,historyLoadingLabel:ge="Loading earlier messages",inputDisabled:d=!1,attachment:a,onAttachmentRemove:J,errorMessage:Z,width:Te,height:Se,className:ve,style:Me})=>{const[R,Q]=i.useState(""),[Re,Y]=i.useState(!1),[L,A]=i.useState(!0),[y,ee]=i.useState(null),[u,Le]=i.useState({}),[b,I]=i.useState(null),B=i.useRef(null),x=i.useRef(null),m=i.useRef(null),_=i.useRef(null),H=i.useRef(0),P=i.useRef(null),g=r.filter(t=>(t.content.length>0||t.wasInterrupted)&&!We.isCopilotRegeneratePrompt(t.content)),te=g.length===0&&!C,h=C||we,oe=!d&&!h&&(R.trim().length>0||!!a),j=h&&!!K,E=g[g.length-1],F=!h&&E?.role==="assistant"?E.followUps:void 0,O=!te&&!L;i.useEffect(()=>{L&&m.current?.scrollIntoView({behavior:"smooth"})},[r,C,L]),i.useEffect(()=>{const t=_.current,n=P.current;!t||n===null||w||(P.current=null,t.scrollTop=t.scrollHeight-n,H.current=t.scrollTop)},[r,w]);const Ae=()=>{const t=_.current;if(!t)return;const n=t.scrollHeight-t.scrollTop-t.clientHeight;t.scrollTop<=Je&&be&&!w&&z&&(P.current=t.scrollHeight-t.scrollTop,z());const c=t.scrollTop<H.current-1;if(H.current=t.scrollTop,n<=Xe){A(!0);return}c&&A(!1)},Ie=()=>{A(!0),m.current?.scrollIntoView({behavior:"smooth"})};i.useEffect(()=>()=>{x.current&&window.clearTimeout(x.current)},[]);const Be=async t=>{await ze(t.content)&&(x.current&&window.clearTimeout(x.current),ee(t.id),x.current=window.setTimeout(()=>ee(null),Ge))},re=(t,n)=>{const c=u[t]===n;if(Le(s=>({...s,[t]:s[t]===n?void 0:n})),c){n==="dislike"&&I(s=>s===t?null:s);return}if(n==="like"){M?.(t,"like");return}b&&b!==t&&M?.(b,"dislike"),I(t)},ne=(t,n)=>{I(c=>c===t?null:c),M?.(t,"dislike",n)},me=()=>{d||h||U?.()},ie=()=>{const t=R.trim();if(!t&&!a||d||h)return;l(a?Ne.buildCopilotSelectionPrompt(a,t):t),Q(""),J?.();const n=B.current;n&&(n.style.height="auto")};i.useEffect(()=>{a&&B.current?.focus()},[a]);const _e=t=>{Q(t.target.value);const n=t.target;n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,Ke)}px`},He=t=>{t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),ie())},Pe=t=>{d||h||(ue?.(t),l(t.text))},Ee=t=>{d||h||l(t)};return e.jsxs(o.PanelContainer,{className:ve,style:{width:Te,height:Se,...Me},role:"dialog","aria-label":k,children:[e.jsxs(o.PanelHeader,{children:[e.jsx(o.HeaderAvatar,{children:de??e.jsx(f.default,{width:18,height:18})}),e.jsxs(o.HeaderText,{children:[e.jsxs(o.HeaderTitleRow,{children:[e.jsx(T.TitleSmall,{children:k}),q&&e.jsx(o.HeaderBadge,{children:q})]}),W&&e.jsx(T.BodyCaption,{color:p.COLORS.content.secondary,children:W})]}),e.jsxs(o.HeaderActions,{children:[pe&&D&&e.jsx(o.IconAction,{type:"button",onClick:D,"aria-label":"Start a new conversation",children:e.jsx(Oe.default,{width:16,height:16})}),e.jsx(o.IconAction,{type:"button",onClick:S,"aria-label":"Close copilot",children:e.jsx(le.default,{width:18,height:18})})]})]}),e.jsxs(o.MessagesViewport,{children:[e.jsx(o.MessagesArea,{ref:_,onScroll:Ae,role:"region","aria-label":"Conversation",children:te?e.jsxs(o.EmptyState,{children:[e.jsx(o.EmptyStateIcon,{children:e.jsx(f.default,{width:28,height:28})}),e.jsx(T.BodySecondary,{style:{fontWeight:600},children:he||k}),$&&e.jsx(T.BodyCaption,{color:p.COLORS.content.secondary,children:$}),v&&v.length>0&&e.jsx(o.SuggestionList,{children:v.map(t=>e.jsxs(o.SuggestionChip,{type:"button",disabled:d||h,onClick:()=>Pe(t),children:[e.jsx(f.default,{width:14,height:14}),t.text]},t.id))})]}):e.jsxs(e.Fragment,{children:[w&&e.jsxs(o.HistoryLoader,{role:"status","aria-live":"polite",children:[e.jsx(se.DotPulse,{color:p.COLORS.content.placeholder,size:4}),ge]}),g.map(t=>{const n=t.role==="user"?Ze(t.timestamp):"";return e.jsxs(Ve.default.Fragment,{children:[t.content.length>0&&e.jsx(o.MessageBubble,{$role:t.role,children:t.role==="assistant"?e.jsx("div",{dangerouslySetInnerHTML:{__html:$e.renderCopilotMarkdown(t.content)}}):e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.content})}),t.role==="assistant"&&!t.isStreaming&&(()=>{const c=De.toolResultCtas(t.toolResults);return c.length===0?null:e.jsx(o.ToolCtaList,{children:c.map(s=>e.jsx(o.ToolCtaLink,{href:s.url,target:"_blank",rel:"noopener noreferrer",onClick:()=>ye?.({tool:s.tool,url:s.url}),children:s.label},`${s.tool}-${s.url}`))})})(),n&&e.jsx(o.MessageTimestamp,{children:n}),t.wasInterrupted&&X&&e.jsxs(o.InterruptedNote,{children:[e.jsx(ce,{size:12}),X]}),t.role==="assistant"&&t.content.length>0&&!t.isStreaming&&e.jsxs(o.MessageActions,{children:[e.jsx(o.MessageAction,{type:"button",onClick:()=>{Be(t)},"data-copied":y===t.id,title:y===t.id?"Copied":"Copy","aria-label":y===t.id?"Response copied to clipboard":"Copy response",children:y===t.id?e.jsx(tt,{}):e.jsx(et,{})}),U&&t.id===E?.id&&e.jsx(o.MessageAction,{type:"button",onClick:me,disabled:d||h,title:"Regenerate","aria-label":"Regenerate response",children:e.jsx(ot,{})}),e.jsx(o.MessageAction,{type:"button",onClick:()=>re(t.id,"like"),"data-selected":u[t.id]==="like","aria-pressed":u[t.id]==="like",title:"Good response","aria-label":"Good response",children:e.jsx(rt,{filled:u[t.id]==="like"})}),e.jsx(o.MessageAction,{type:"button",onClick:()=>re(t.id,"dislike"),"data-selected":u[t.id]==="dislike","aria-pressed":u[t.id]==="dislike",title:"Bad response","aria-label":"Bad response",children:e.jsx(nt,{filled:u[t.id]==="dislike"})})]}),b===t.id&&e.jsx(qe.CopilotFeedbackModal,{title:xe,subtitle:je??`Help us improve ${k}`,reasons:fe,notePlaceholder:ke,submitLabel:Ce,onSubmit:c=>ne(t.id,c),onDismiss:()=>ne(t.id)})]},t.id)}),F&&F.length>0&&e.jsxs(o.FollowUpList,{children:[G&&e.jsx(o.FollowUpsLabel,{children:G}),F.map(t=>e.jsxs(o.FollowUpChip,{type:"button",disabled:d,onClick:()=>Ee(t),children:[e.jsx(Ye,{}),t]},t))]}),C&&e.jsxs(o.ThinkingBubble,{role:"status","aria-live":"polite",children:[e.jsx(f.default,{width:14,height:14,color:p.COLORS.content.brand}),V&&e.jsx(o.ThinkingLabel,{children:V}),e.jsx(se.DotPulse,{color:p.COLORS.background.brand,size:5})]}),e.jsx("div",{ref:m})]})}),e.jsx(o.ScrollFade,{$visible:O,"aria-hidden":"true"}),e.jsx(o.JumpToLatestButton,{type:"button",$visible:O,onClick:Ie,tabIndex:O?0:-1,"aria-label":"Scroll to the latest message",children:e.jsx(Fe.default,{width:16,height:16})})]}),Z&&e.jsx(o.ErrorBanner,{role:"alert",children:Z}),e.jsxs(o.InputArea,{children:[a&&e.jsxs(o.AttachmentChip,{children:[e.jsx(f.default,{width:14,height:14,color:p.COLORS.content.brand}),e.jsx(o.AttachmentText,{title:a,children:a}),e.jsx(o.AttachmentRemove,{type:"button",onClick:J,"aria-label":"Remove the selected text",children:e.jsx(le.default,{width:12,height:12})})]}),e.jsxs(o.InputWrapper,{$focused:Re,children:[e.jsx(o.MessageInput,{ref:B,rows:1,value:R,placeholder:ae,disabled:d,onChange:_e,onKeyDown:He,onFocus:()=>Y(!0),onBlur:()=>Y(!1)}),e.jsx(o.SendButton,{type:"button",$active:j||oe,disabled:!j&&!oe,onClick:j?K:ie,"aria-label":j?"Stop generating":"Send message",children:j?e.jsx(ce,{}):e.jsx(Qe,{})})]})]}),N&&e.jsx(o.Disclaimer,{children:N})]})};exports.CopilotPanel=it;
2
2
  //# sourceMappingURL=CopilotPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CopilotPanel.js","sources":["../../../../src/components/bik-copilot/CopilotPanel.tsx"],"sourcesContent":["import ArrowDownIcon from '@src/assets/icons/arrow_down.svg';\nimport AiStarsIcon from '@src/assets/icons/bik_ai_stars_icon.svg';\nimport CrossIcon from '@src/assets/icons/cross.svg';\nimport RefreshIcon from '@src/assets/icons/refresh.svg';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { COLORS } from '@src/constants/Theme';\nimport { DotPulse } from '../dot-pulse';\nimport { BodyCaption, BodySecondary, TitleSmall } from '../TypographyStyle';\nimport { CopilotFeedbackModal } from './CopilotFeedbackModal';\nimport {\n\tDisclaimer,\n\tEmptyState,\n\tEmptyStateIcon,\n\tErrorBanner,\n\tFollowUpChip,\n\tFollowUpList,\n\tFollowUpsLabel,\n\tHeaderActions,\n\tHeaderAvatar,\n\tHeaderBadge,\n\tHeaderText,\n\tHeaderTitleRow,\n\tHistoryLoader,\n\tIconAction,\n\tInputArea,\n\tInputWrapper,\n\tInterruptedNote,\n\tJumpToLatestButton,\n\tMessageAction,\n\tMessageActions,\n\tMessageBubble,\n\tMessageInput,\n\tMessagesArea,\n\tMessagesViewport,\n\tMessageTimestamp,\n\tPanelContainer,\n\tPanelHeader,\n\tScrollFade,\n\tSendButton,\n\tSuggestionChip,\n\tSuggestionList,\n\tThinkingBubble,\n\tThinkingLabel,\n\tToolCtaLink,\n\tToolCtaList,\n} from './CopilotPanel.styled';\nimport { isCopilotRegeneratePrompt } from './copilotRegenerate';\nimport { CopilotFeedbackDetail, CopilotPanelProps } from './model';\nimport { renderCopilotMarkdown } from './utils/markdown';\nimport { toolResultCtas } from './utils/toolCtas';\n\nconst MAX_INPUT_HEIGHT_PX = 96;\n\n/** Slack at the bottom of the scroller that still counts as \"at the latest\". */\nconst AT_BOTTOM_TOLERANCE_PX = 24;\n\n/** How long the copy button shows its confirmation before reverting. */\nconst COPIED_FEEDBACK_MS = 1800;\n\n/**\n * Writes text to the clipboard.\n *\n * `navigator.clipboard` is missing outside a secure context and can reject when\n * the document is not focused, so a hidden-textarea `execCommand` fallback keeps\n * the button working there rather than failing silently.\n */\nconst writeToClipboard = async (text: string): Promise<boolean> => {\n\ttry {\n\t\tif (navigator.clipboard?.writeText) {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// Fall through to the legacy path.\n\t}\n\n\ttry {\n\t\tconst textarea = document.createElement('textarea');\n\t\ttextarea.value = text;\n\t\t// Off-screen rather than hidden: `display: none` cannot be selected.\n\t\ttextarea.setAttribute('readonly', '');\n\t\ttextarea.style.position = 'fixed';\n\t\ttextarea.style.top = '-1000px';\n\t\ttextarea.style.opacity = '0';\n\t\tdocument.body.appendChild(textarea);\n\t\ttextarea.select();\n\t\tconst copied = document.execCommand('copy');\n\t\tdocument.body.removeChild(textarea);\n\t\treturn copied;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\n/** How close to the top counts as asking for the previous page. */\nconst NEAR_TOP_TOLERANCE_PX = 48;\n\nconst formatMessageTime = (timestamp: number): string => {\n\tif (!timestamp || !Number.isFinite(timestamp)) {\n\t\treturn '';\n\t}\n\tconst date = new Date(timestamp);\n\tif (Number.isNaN(date.getTime())) {\n\t\treturn '';\n\t}\n\treturn date.toLocaleTimeString('en-US', {\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t});\n};\n\nconst SendArrowIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M12 19V5\" />\n\t\t<path d=\"M6 11l6-6 6 6\" />\n\t</svg>\n);\n\nconst ArrowRightIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M5 12h14\" />\n\t\t<path d=\"M13 6l6 6-6 6\" />\n\t</svg>\n);\n\nconst StopIcon = ({ size = 16 }: { size?: number }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"2\" />\n\t</svg>\n);\n\nconst CopyIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n\t\t<path d=\"M15 5.5A1.5 1.5 0 0 0 13.5 4H5.5A1.5 1.5 0 0 0 4 5.5v8A1.5 1.5 0 0 0 5.5 15\" />\n\t</svg>\n);\n\nconst CheckIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2.2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M5 13l4 4L19 7\" />\n\t</svg>\n);\n\nconst RegenerateIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M20 12a8 8 0 1 1-2.34-5.66\" />\n\t\t<path d=\"M20 4v4h-4\" />\n\t</svg>\n);\n\nconst ThumbUpIcon = ({ filled = false }: { filled?: boolean }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill={filled ? 'currentColor' : 'none'}\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M7 10v11H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h3Z\" />\n\t\t<path d=\"M7 10l4.5-7a2 2 0 0 1 3.7 1.3L14.5 9H19a2 2 0 0 1 2 2.3l-1.1 7A2 2 0 0 1 18 20H7\" />\n\t</svg>\n);\n\nconst ThumbDownIcon = ({ filled = false }: { filled?: boolean }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill={filled ? 'currentColor' : 'none'}\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M7 14V3H4a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3Z\" />\n\t\t<path d=\"M7 14l4.5 7a2 2 0 0 0 3.7-1.3L14.5 15H19a2 2 0 0 0 2-2.3l-1.1-7A2 2 0 0 0 18 4H7\" />\n\t</svg>\n);\n\n/**\n * Chat panel used by the copilot. Fully presentational: it renders the\n * transcript it is given and reports user intent through callbacks, so it works\n * against any backend.\n */\nexport const CopilotPanel: React.FC<CopilotPanelProps> = ({\n\tmessages,\n\tonSend,\n\tonClose,\n\ttitle = 'Copilot',\n\tbadge,\n\tsubtitle,\n\tavatar,\n\tplaceholder = 'Write your message...',\n\tdisclaimer = 'AI can make mistakes, Verify the responses.',\n\temptyStateTitle,\n\temptyStateSubtitle = 'Here are some things you can try',\n\tsuggestions,\n\tonSuggestionClick,\n\tshowRefresh = true,\n\tonRefresh,\n\tonRegenerate,\n\tonFeedback,\n\tdislikeTitle,\n\tdislikeSubtitle,\n\tdislikeReasons,\n\tdislikeNotePlaceholder,\n\tdislikeSubmitLabel,\n\tisThinking = false,\n\tthinkingLabel = 'Thinking',\n\tisStreaming = false,\n\tonStop,\n\tinterruptedLabel = 'This message was interrupted',\n\tfollowUpsLabel = 'Follow ups',\n\tonToolCtaClick,\n\thasMoreHistory = false,\n\tisLoadingHistory = false,\n\tonLoadOlderMessages,\n\thistoryLoadingLabel = 'Loading earlier messages',\n\tinputDisabled = false,\n\terrorMessage,\n\twidth,\n\theight,\n\tclassName,\n\tstyle,\n}) => {\n\tconst [input, setInput] = useState('');\n\tconst [isInputFocused, setIsInputFocused] = useState(false);\n\tconst [isAtLatest, setIsAtLatest] = useState(true);\n\t// Which reply is showing \"Copied\" — per message, so copying one does not tick\n\t// the button under another.\n\tconst [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n\n\tconst [feedback, setFeedback] = useState<\n\t\tRecord<string, 'like' | 'dislike' | undefined>\n\t>({});\n\t// Which reply is being asked about. A thumbs-down opens the prompt and the\n\t// rating is reported once it is answered or dismissed -- so pressing the\n\t// thumb is never lost, and one thumb never becomes two ratings.\n\tconst [dislikePromptId, setDislikePromptId] = useState<string | null>(null);\n\tconst inputRef = useRef<HTMLTextAreaElement>(null);\n\tconst copiedTimeoutRef = useRef<number | null>(null);\n\tconst bottomRef = useRef<HTMLDivElement>(null);\n\tconst scrollerRef = useRef<HTMLDivElement>(null);\n\tconst lastScrollTopRef = useRef(0);\n\t// Distance from the bottom at the moment an older page was asked for. Older\n\t// messages land *above* the viewport, so without restoring against this the\n\t// content under the reader jumps down by the height of what arrived.\n\tconst anchorFromBottomRef = useRef<number | null>(null);\n\n\t// An assistant bubble is pushed the moment a turn starts, before any text has\n\t// arrived; the thinking indicator stands in for it until then, so rendering it\n\t// too would show an empty balloon next to the dots. A turn stopped before its\n\t// first token keeps its place, carrying only the interrupted note.\n\tconst visibleMessages = messages.filter(\n\t\t(message) =>\n\t\t\t(message.content.length > 0 || message.wasInterrupted) &&\n\t\t\t!isCopilotRegeneratePrompt(message.content),\n\t);\n\tconst isEmpty = visibleMessages.length === 0 && !isThinking;\n\tconst isTurnInFlight = isThinking || isStreaming;\n\tconst canSend = !inputDisabled && !isTurnInFlight && input.trim().length > 0;\n\t// Stopping is the only thing the button can do mid-answer, so it becomes the\n\t// stop button rather than sitting there disabled.\n\tconst canStop = isTurnInFlight && Boolean(onStop);\n\t// Only the newest reply's suggestions are on offer — older ones answer a\n\t// question the conversation has already moved past.\n\tconst newestMessage = visibleMessages[visibleMessages.length - 1];\n\tconst followUps =\n\t\t!isTurnInFlight && newestMessage?.role === 'assistant'\n\t\t\t? newestMessage.followUps\n\t\t\t: undefined;\n\t// A long answer that the reader has scrolled up from: the tail is clipped, so\n\t// the fade and the arrow say there is more below.\n\tconst showScrollAffordance = !isEmpty && !isAtLatest;\n\n\t// Following the conversation is the default, but a reader who has scrolled up\n\t// mid-answer must not be yanked back down by the next chunk.\n\tuseEffect(() => {\n\t\tif (!isAtLatest) {\n\t\t\treturn;\n\t\t}\n\t\tbottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t}, [messages, isThinking, isAtLatest]);\n\n\t// Older messages have landed: put the reader back on the message they were\n\t// looking at, which is now that much further down.\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tconst anchor = anchorFromBottomRef.current;\n\t\tif (!scroller || anchor === null || isLoadingHistory) {\n\t\t\treturn;\n\t\t}\n\t\tanchorFromBottomRef.current = null;\n\t\tscroller.scrollTop = scroller.scrollHeight - anchor;\n\t\tlastScrollTopRef.current = scroller.scrollTop;\n\t}, [messages, isLoadingHistory]);\n\n\tconst handleScroll = () => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst distanceFromBottom =\n\t\t\tscroller.scrollHeight - scroller.scrollTop - scroller.clientHeight;\n\n\t\t// Reaching the top asks for the page before this one. The threshold gives\n\t\t// the request a head start, so the page is usually there by the time the\n\t\t// reader arrives.\n\t\tif (\n\t\t\tscroller.scrollTop <= NEAR_TOP_TOLERANCE_PX &&\n\t\t\thasMoreHistory &&\n\t\t\t!isLoadingHistory &&\n\t\t\tonLoadOlderMessages\n\t\t) {\n\t\t\tanchorFromBottomRef.current = scroller.scrollHeight - scroller.scrollTop;\n\t\t\tonLoadOlderMessages();\n\t\t}\n\t\t// Scrolling *up* is the only thing that detaches from the latest message:\n\t\t// growing content also pushes the bottom away, and auto-scroll itself only\n\t\t// ever moves down, so distance alone would flap mid-stream.\n\t\tconst scrolledUp = scroller.scrollTop < lastScrollTopRef.current - 1;\n\t\tlastScrollTopRef.current = scroller.scrollTop;\n\n\t\tif (distanceFromBottom <= AT_BOTTOM_TOLERANCE_PX) {\n\t\t\tsetIsAtLatest(true);\n\t\t\treturn;\n\t\t}\n\t\tif (scrolledUp) {\n\t\t\tsetIsAtLatest(false);\n\t\t}\n\t};\n\n\tconst handleJumpToLatest = () => {\n\t\tsetIsAtLatest(true);\n\t\tbottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t};\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tif (copiedTimeoutRef.current) {\n\t\t\t\twindow.clearTimeout(copiedTimeoutRef.current);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleCopyMessage = async (\n\t\tmessage: CopilotPanelProps['messages'][number],\n\t) => {\n\t\t// The raw markdown, not the rendered HTML — that is what a reader wants to\n\t\t// paste into a doc or a ticket.\n\t\tconst copied = await writeToClipboard(message.content);\n\t\tif (!copied) {\n\t\t\treturn;\n\t\t}\n\t\tif (copiedTimeoutRef.current) {\n\t\t\twindow.clearTimeout(copiedTimeoutRef.current);\n\t\t}\n\t\tsetCopiedMessageId(message.id);\n\t\tcopiedTimeoutRef.current = window.setTimeout(\n\t\t\t() => setCopiedMessageId(null),\n\t\t\tCOPIED_FEEDBACK_MS,\n\t\t);\n\t};\n\n\tconst handleFeedback = (messageId: string, vote: 'like' | 'dislike') => {\n\t\t// Pressing the same thumb again clears the vote. Nothing is reported for\n\t\t// that: the backend records ratings, not their absence.\n\t\tconst cleared = feedback[messageId] === vote;\n\t\tsetFeedback((previous) => ({\n\t\t\t...previous,\n\t\t\t[messageId]: previous[messageId] === vote ? undefined : vote,\n\t\t}));\n\t\t// Everything below sits outside the updater on purpose: React may run an\n\t\t// updater twice, which would report the same vote twice.\n\t\tif (cleared) {\n\t\t\tif (vote === 'dislike') {\n\t\t\t\tsetDislikePromptId((current) =>\n\t\t\t\t\tcurrent === messageId ? null : current,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (vote === 'like') {\n\t\t\tonFeedback?.(messageId, 'like');\n\t\t\treturn;\n\t\t}\n\t\t// A thumbs-down asks what went wrong first. Moving the prompt to another\n\t\t// reply still records the one it is leaving.\n\t\tif (dislikePromptId && dislikePromptId !== messageId) {\n\t\t\tonFeedback?.(dislikePromptId, 'dislike');\n\t\t}\n\t\tsetDislikePromptId(messageId);\n\t};\n\n\tconst reportDislike = (messageId: string, detail?: CopilotFeedbackDetail) => {\n\t\tsetDislikePromptId((current) => (current === messageId ? null : current));\n\t\tonFeedback?.(messageId, 'dislike', detail);\n\t};\n\n\tconst handleRegenerate = () => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonRegenerate?.();\n\t};\n\n\tconst handleSend = () => {\n\t\tconst trimmed = input.trim();\n\t\tif (!trimmed || inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonSend(trimmed);\n\t\tsetInput('');\n\t\tconst textarea = inputRef.current;\n\t\tif (textarea) {\n\t\t\ttextarea.style.height = 'auto';\n\t\t}\n\t};\n\n\tconst handleInputChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\tsetInput(event.target.value);\n\t\tconst textarea = event.target;\n\t\ttextarea.style.height = 'auto';\n\t\ttextarea.style.height = `${Math.min(\n\t\t\ttextarea.scrollHeight,\n\t\t\tMAX_INPUT_HEIGHT_PX,\n\t\t)}px`;\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\tif (event.key === 'Enter' && !event.shiftKey) {\n\t\t\tevent.preventDefault();\n\t\t\thandleSend();\n\t\t}\n\t};\n\n\tconst handleSuggestionClick = (\n\t\tsuggestion: NonNullable<CopilotPanelProps['suggestions']>[number],\n\t) => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonSuggestionClick?.(suggestion);\n\t\tonSend(suggestion.text);\n\t};\n\n\tconst handleFollowUpClick = (followUp: string) => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonSend(followUp);\n\t};\n\n\treturn (\n\t\t<PanelContainer\n\t\t\tclassName={className}\n\t\t\tstyle={{ width, height, ...style }}\n\t\t\trole=\"dialog\"\n\t\t\taria-label={title}\n\t\t>\n\t\t\t<PanelHeader>\n\t\t\t\t<HeaderAvatar>\n\t\t\t\t\t{avatar ?? <AiStarsIcon width={18} height={18} />}\n\t\t\t\t</HeaderAvatar>\n\t\t\t\t<HeaderText>\n\t\t\t\t\t<HeaderTitleRow>\n\t\t\t\t\t\t<TitleSmall>{title}</TitleSmall>\n\t\t\t\t\t\t{badge && <HeaderBadge>{badge}</HeaderBadge>}\n\t\t\t\t\t</HeaderTitleRow>\n\t\t\t\t\t{subtitle && (\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t)}\n\t\t\t\t</HeaderText>\n\t\t\t\t<HeaderActions>\n\t\t\t\t\t{showRefresh && onRefresh && (\n\t\t\t\t\t\t<IconAction\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRefresh}\n\t\t\t\t\t\t\taria-label=\"Start a new conversation\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshIcon width={16} height={16} />\n\t\t\t\t\t\t</IconAction>\n\t\t\t\t\t)}\n\t\t\t\t\t<IconAction\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close copilot\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<CrossIcon width={18} height={18} />\n\t\t\t\t\t</IconAction>\n\t\t\t\t</HeaderActions>\n\t\t\t</PanelHeader>\n\n\t\t\t<MessagesViewport>\n\t\t\t\t<MessagesArea\n\t\t\t\t\tref={scrollerRef}\n\t\t\t\t\tonScroll={handleScroll}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Conversation\"\n\t\t\t\t>\n\t\t\t\t\t{isEmpty ? (\n\t\t\t\t\t\t<EmptyState>\n\t\t\t\t\t\t\t<EmptyStateIcon>\n\t\t\t\t\t\t\t\t<AiStarsIcon width={28} height={28} />\n\t\t\t\t\t\t\t</EmptyStateIcon>\n\t\t\t\t\t\t\t<BodySecondary style={{ fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t{emptyStateTitle || title}\n\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t{emptyStateSubtitle && (\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\t{emptyStateSubtitle}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{suggestions && suggestions.length > 0 && (\n\t\t\t\t\t\t\t\t<SuggestionList>\n\t\t\t\t\t\t\t\t\t{suggestions.map((suggestion) => (\n\t\t\t\t\t\t\t\t\t\t<SuggestionChip\n\t\t\t\t\t\t\t\t\t\t\tkey={suggestion.id}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled || isTurnInFlight}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSuggestionClick(suggestion)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<AiStarsIcon width={14} height={14} />\n\t\t\t\t\t\t\t\t\t\t\t{suggestion.text}\n\t\t\t\t\t\t\t\t\t\t</SuggestionChip>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</SuggestionList>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</EmptyState>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{isLoadingHistory && (\n\t\t\t\t\t\t\t\t<HistoryLoader role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t<DotPulse color={COLORS.content.placeholder} size={4} />\n\t\t\t\t\t\t\t\t\t{historyLoadingLabel}\n\t\t\t\t\t\t\t\t</HistoryLoader>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{visibleMessages.map((message) => {\n\t\t\t\t\t\t\t\tconst sentAt =\n\t\t\t\t\t\t\t\t\tmessage.role === 'user'\n\t\t\t\t\t\t\t\t\t\t? formatMessageTime(message.timestamp)\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<React.Fragment key={message.id}>\n\t\t\t\t\t\t\t\t\t\t{message.content.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<MessageBubble $role={message.role}>\n\t\t\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t__html: renderCopilotMarkdown(message.content),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div style={{ whiteSpace: 'pre-wrap' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{message.content}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</MessageBubble>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{/* Tool CTAs (e.g. the support-portal link) — only once the\n\t\t\t\t\t\t\t\t\t\t reply has finished, so a button cannot flash mid-stream. */}\n\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' &&\n\t\t\t\t\t\t\t\t\t\t\t!message.isStreaming &&\n\t\t\t\t\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst ctas = toolResultCtas(message.toolResults);\n\t\t\t\t\t\t\t\t\t\t\t\tif (ctas.length === 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolCtaList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ctas.map((cta) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolCtaLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${cta.tool}-${cta.url}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thref={cta.url}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonToolCtaClick?.({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttool: cta.tool,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turl: cta.url,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{cta.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ToolCtaLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ToolCtaList>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t\t\t\t\t{sentAt && <MessageTimestamp>{sentAt}</MessageTimestamp>}\n\t\t\t\t\t\t\t\t\t\t{message.wasInterrupted && interruptedLabel && (\n\t\t\t\t\t\t\t\t\t\t\t<InterruptedNote>\n\t\t\t\t\t\t\t\t\t\t\t\t<StopIcon size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t{interruptedLabel}\n\t\t\t\t\t\t\t\t\t\t\t</InterruptedNote>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{/* Only under a finished reply: mid-stream the text is still\n\t\t\t\t\t\t\t\t\t\t changing, so copying it would capture a partial answer. */}\n\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' &&\n\t\t\t\t\t\t\t\t\t\t\tmessage.content.length > 0 &&\n\t\t\t\t\t\t\t\t\t\t\t!message.isStreaming && (\n\t\t\t\t\t\t\t\t\t\t\t\t<MessageActions>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void handleCopyMessage(message)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-copied={copiedMessageId === message.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcopiedMessageId === message.id ? 'Copied' : 'Copy'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcopiedMessageId === message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Response copied to clipboard'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'Copy response'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{copiedMessageId === message.id ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CopyIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/* Only under the newest reply: regenerating appends a\n\t\t\t\t\t\t\t\t\t\t\t\t\t fresh turn at the end, so offering it against an\n\t\t\t\t\t\t\t\t\t\t\t\t\t older answer would not replace that answer. */}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{onRegenerate && message.id === newestMessage?.id && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleRegenerate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled || isTurnInFlight}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Regenerate\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Regenerate response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<RegenerateIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(message.id, 'like')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-selected={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-pressed={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Good response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Good response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ThumbUpIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilled={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleFeedback(message.id, 'dislike')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-selected={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-pressed={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Bad response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Bad response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ThumbDownIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilled={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t</MessageActions>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{dislikePromptId === message.id && (\n\t\t\t\t\t\t\t\t\t\t\t<CopilotFeedbackModal\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={dislikeTitle}\n\t\t\t\t\t\t\t\t\t\t\t\tsubtitle={dislikeSubtitle ?? `Help us improve ${title}`}\n\t\t\t\t\t\t\t\t\t\t\t\treasons={dislikeReasons}\n\t\t\t\t\t\t\t\t\t\t\t\tnotePlaceholder={dislikeNotePlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tsubmitLabel={dislikeSubmitLabel}\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit={(detail) => reportDislike(message.id, detail)}\n\t\t\t\t\t\t\t\t\t\t\t\tonDismiss={() => reportDislike(message.id)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t{followUps && followUps.length > 0 && (\n\t\t\t\t\t\t\t\t<FollowUpList>\n\t\t\t\t\t\t\t\t\t{followUpsLabel && (\n\t\t\t\t\t\t\t\t\t\t<FollowUpsLabel>{followUpsLabel}</FollowUpsLabel>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{followUps.map((followUp) => (\n\t\t\t\t\t\t\t\t\t\t<FollowUpChip\n\t\t\t\t\t\t\t\t\t\t\tkey={followUp}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleFollowUpClick(followUp)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ArrowRightIcon />\n\t\t\t\t\t\t\t\t\t\t\t{followUp}\n\t\t\t\t\t\t\t\t\t\t</FollowUpChip>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</FollowUpList>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{isThinking && (\n\t\t\t\t\t\t\t\t<ThinkingBubble role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t<AiStarsIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.brand}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{thinkingLabel && (\n\t\t\t\t\t\t\t\t\t\t<ThinkingLabel>{thinkingLabel}</ThinkingLabel>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<DotPulse color={COLORS.background.brand} size={5} />\n\t\t\t\t\t\t\t\t</ThinkingBubble>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div ref={bottomRef} />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</MessagesArea>\n\n\t\t\t\t<ScrollFade $visible={showScrollAffordance} aria-hidden=\"true\" />\n\t\t\t\t<JumpToLatestButton\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t$visible={showScrollAffordance}\n\t\t\t\t\tonClick={handleJumpToLatest}\n\t\t\t\t\ttabIndex={showScrollAffordance ? 0 : -1}\n\t\t\t\t\taria-label=\"Scroll to the latest message\"\n\t\t\t\t>\n\t\t\t\t\t<ArrowDownIcon width={16} height={16} />\n\t\t\t\t</JumpToLatestButton>\n\t\t\t</MessagesViewport>\n\n\t\t\t{errorMessage && <ErrorBanner role=\"alert\">{errorMessage}</ErrorBanner>}\n\n\t\t\t<InputArea>\n\t\t\t\t<InputWrapper $focused={isInputFocused}>\n\t\t\t\t\t<MessageInput\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\trows={1}\n\t\t\t\t\t\tvalue={input}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdisabled={inputDisabled}\n\t\t\t\t\t\tonChange={handleInputChange}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tonFocus={() => setIsInputFocused(true)}\n\t\t\t\t\t\tonBlur={() => setIsInputFocused(false)}\n\t\t\t\t\t/>\n\t\t\t\t\t<SendButton\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={canStop || canSend}\n\t\t\t\t\t\tdisabled={!canStop && !canSend}\n\t\t\t\t\t\tonClick={canStop ? onStop : handleSend}\n\t\t\t\t\t\taria-label={canStop ? 'Stop generating' : 'Send message'}\n\t\t\t\t\t>\n\t\t\t\t\t\t{canStop ? <StopIcon /> : <SendArrowIcon />}\n\t\t\t\t\t</SendButton>\n\t\t\t\t</InputWrapper>\n\t\t\t</InputArea>\n\n\t\t\t{disclaimer && <Disclaimer>{disclaimer}</Disclaimer>}\n\t\t</PanelContainer>\n\t);\n};\n\nexport default CopilotPanel;\n"],"names":["MAX_INPUT_HEIGHT_PX","AT_BOTTOM_TOLERANCE_PX","COPIED_FEEDBACK_MS","writeToClipboard","text","textarea","copied","NEAR_TOP_TOLERANCE_PX","formatMessageTime","timestamp","date","SendArrowIcon","jsxs","jsx","ArrowRightIcon","StopIcon","size","CopyIcon","CheckIcon","RegenerateIcon","ThumbUpIcon","filled","ThumbDownIcon","CopilotPanel","messages","onSend","onClose","title","badge","subtitle","avatar","placeholder","disclaimer","emptyStateTitle","emptyStateSubtitle","suggestions","onSuggestionClick","showRefresh","onRefresh","onRegenerate","onFeedback","dislikeTitle","dislikeSubtitle","dislikeReasons","dislikeNotePlaceholder","dislikeSubmitLabel","isThinking","thinkingLabel","isStreaming","onStop","interruptedLabel","followUpsLabel","onToolCtaClick","hasMoreHistory","isLoadingHistory","onLoadOlderMessages","historyLoadingLabel","inputDisabled","errorMessage","width","height","className","style","input","setInput","useState","isInputFocused","setIsInputFocused","isAtLatest","setIsAtLatest","copiedMessageId","setCopiedMessageId","feedback","setFeedback","dislikePromptId","setDislikePromptId","inputRef","useRef","copiedTimeoutRef","bottomRef","scrollerRef","lastScrollTopRef","anchorFromBottomRef","visibleMessages","message","isCopilotRegeneratePrompt","isEmpty","isTurnInFlight","canSend","canStop","newestMessage","followUps","showScrollAffordance","useEffect","scroller","anchor","handleScroll","distanceFromBottom","scrolledUp","handleJumpToLatest","handleCopyMessage","handleFeedback","messageId","vote","cleared","previous","current","reportDislike","detail","handleRegenerate","handleSend","trimmed","handleInputChange","event","handleKeyDown","handleSuggestionClick","suggestion","handleFollowUpClick","followUp","PanelContainer","PanelHeader","HeaderAvatar","AiStarsIcon","HeaderText","HeaderTitleRow","TitleSmall","HeaderBadge","BodyCaption","COLORS","HeaderActions","IconAction","RefreshIcon","CrossIcon","MessagesViewport","MessagesArea","EmptyState","EmptyStateIcon","BodySecondary","SuggestionList","SuggestionChip","Fragment","HistoryLoader","DotPulse","sentAt","React","MessageBubble","renderCopilotMarkdown","ctas","toolResultCtas","ToolCtaList","cta","ToolCtaLink","MessageTimestamp","InterruptedNote","MessageActions","MessageAction","CopilotFeedbackModal","FollowUpList","FollowUpsLabel","FollowUpChip","ThinkingBubble","ThinkingLabel","ScrollFade","JumpToLatestButton","ArrowDownIcon","ErrorBanner","InputArea","InputWrapper","MessageInput","SendButton","Disclaimer"],"mappings":"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"}
1
+ {"version":3,"file":"CopilotPanel.js","sources":["../../../../src/components/bik-copilot/CopilotPanel.tsx"],"sourcesContent":["import ArrowDownIcon from '@src/assets/icons/arrow_down.svg';\nimport AiStarsIcon from '@src/assets/icons/bik_ai_stars_icon.svg';\nimport CrossIcon from '@src/assets/icons/cross.svg';\nimport RefreshIcon from '@src/assets/icons/refresh.svg';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { COLORS } from '@src/constants/Theme';\nimport { DotPulse } from '../dot-pulse';\nimport { BodyCaption, BodySecondary, TitleSmall } from '../TypographyStyle';\nimport { CopilotFeedbackModal } from './CopilotFeedbackModal';\nimport {\n\tAttachmentChip,\n\tAttachmentRemove,\n\tAttachmentText,\n\tDisclaimer,\n\tEmptyState,\n\tEmptyStateIcon,\n\tErrorBanner,\n\tFollowUpChip,\n\tFollowUpList,\n\tFollowUpsLabel,\n\tHeaderActions,\n\tHeaderAvatar,\n\tHeaderBadge,\n\tHeaderText,\n\tHeaderTitleRow,\n\tHistoryLoader,\n\tIconAction,\n\tInputArea,\n\tInputWrapper,\n\tInterruptedNote,\n\tJumpToLatestButton,\n\tMessageAction,\n\tMessageActions,\n\tMessageBubble,\n\tMessageInput,\n\tMessagesArea,\n\tMessagesViewport,\n\tMessageTimestamp,\n\tPanelContainer,\n\tPanelHeader,\n\tScrollFade,\n\tSendButton,\n\tSuggestionChip,\n\tSuggestionList,\n\tThinkingBubble,\n\tThinkingLabel,\n\tToolCtaLink,\n\tToolCtaList,\n} from './CopilotPanel.styled';\nimport { isCopilotRegeneratePrompt } from './copilotRegenerate';\nimport { buildCopilotSelectionPrompt } from './copilotSelectionPrompt';\nimport { CopilotFeedbackDetail, CopilotPanelProps } from './model';\nimport { renderCopilotMarkdown } from './utils/markdown';\nimport { toolResultCtas } from './utils/toolCtas';\n\nconst MAX_INPUT_HEIGHT_PX = 96;\n\n/** Slack at the bottom of the scroller that still counts as \"at the latest\". */\nconst AT_BOTTOM_TOLERANCE_PX = 24;\n\n/** How long the copy button shows its confirmation before reverting. */\nconst COPIED_FEEDBACK_MS = 1800;\n\n/**\n * Writes text to the clipboard.\n *\n * `navigator.clipboard` is missing outside a secure context and can reject when\n * the document is not focused, so a hidden-textarea `execCommand` fallback keeps\n * the button working there rather than failing silently.\n */\nconst writeToClipboard = async (text: string): Promise<boolean> => {\n\ttry {\n\t\tif (navigator.clipboard?.writeText) {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\treturn true;\n\t\t}\n\t} catch {\n\t\t// Fall through to the legacy path.\n\t}\n\n\ttry {\n\t\tconst textarea = document.createElement('textarea');\n\t\ttextarea.value = text;\n\t\t// Off-screen rather than hidden: `display: none` cannot be selected.\n\t\ttextarea.setAttribute('readonly', '');\n\t\ttextarea.style.position = 'fixed';\n\t\ttextarea.style.top = '-1000px';\n\t\ttextarea.style.opacity = '0';\n\t\tdocument.body.appendChild(textarea);\n\t\ttextarea.select();\n\t\tconst copied = document.execCommand('copy');\n\t\tdocument.body.removeChild(textarea);\n\t\treturn copied;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\n/** How close to the top counts as asking for the previous page. */\nconst NEAR_TOP_TOLERANCE_PX = 48;\n\nconst formatMessageTime = (timestamp: number): string => {\n\tif (!timestamp || !Number.isFinite(timestamp)) {\n\t\treturn '';\n\t}\n\tconst date = new Date(timestamp);\n\tif (Number.isNaN(date.getTime())) {\n\t\treturn '';\n\t}\n\treturn date.toLocaleTimeString('en-US', {\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t});\n};\n\nconst SendArrowIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M12 19V5\" />\n\t\t<path d=\"M6 11l6-6 6 6\" />\n\t</svg>\n);\n\nconst ArrowRightIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M5 12h14\" />\n\t\t<path d=\"M13 6l6 6-6 6\" />\n\t</svg>\n);\n\nconst StopIcon = ({ size = 16 }: { size?: number }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth={size}\n\t\theight={size}\n\t\tfill=\"currentColor\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"2\" />\n\t</svg>\n);\n\nconst CopyIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" />\n\t\t<path d=\"M15 5.5A1.5 1.5 0 0 0 13.5 4H5.5A1.5 1.5 0 0 0 4 5.5v8A1.5 1.5 0 0 0 5.5 15\" />\n\t</svg>\n);\n\nconst CheckIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"2.2\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M5 13l4 4L19 7\" />\n\t</svg>\n);\n\nconst RegenerateIcon = () => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill=\"none\"\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M20 12a8 8 0 1 1-2.34-5.66\" />\n\t\t<path d=\"M20 4v4h-4\" />\n\t</svg>\n);\n\nconst ThumbUpIcon = ({ filled = false }: { filled?: boolean }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill={filled ? 'currentColor' : 'none'}\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M7 10v11H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1h3Z\" />\n\t\t<path d=\"M7 10l4.5-7a2 2 0 0 1 3.7 1.3L14.5 9H19a2 2 0 0 1 2 2.3l-1.1 7A2 2 0 0 1 18 20H7\" />\n\t</svg>\n);\n\nconst ThumbDownIcon = ({ filled = false }: { filled?: boolean }) => (\n\t<svg\n\t\tviewBox=\"0 0 24 24\"\n\t\twidth=\"14\"\n\t\theight=\"14\"\n\t\tfill={filled ? 'currentColor' : 'none'}\n\t\tstroke=\"currentColor\"\n\t\tstrokeWidth=\"1.8\"\n\t\tstrokeLinecap=\"round\"\n\t\tstrokeLinejoin=\"round\"\n\t\taria-hidden=\"true\"\n\t>\n\t\t<path d=\"M7 14V3H4a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h3Z\" />\n\t\t<path d=\"M7 14l4.5 7a2 2 0 0 0 3.7-1.3L14.5 15H19a2 2 0 0 0 2-2.3l-1.1-7A2 2 0 0 0 18 4H7\" />\n\t</svg>\n);\n\n/**\n * Chat panel used by the copilot. Fully presentational: it renders the\n * transcript it is given and reports user intent through callbacks, so it works\n * against any backend.\n */\nexport const CopilotPanel: React.FC<CopilotPanelProps> = ({\n\tmessages,\n\tonSend,\n\tonClose,\n\ttitle = 'Copilot',\n\tbadge,\n\tsubtitle,\n\tavatar,\n\tplaceholder = 'Write your message...',\n\tdisclaimer = 'AI can make mistakes, Verify the responses.',\n\temptyStateTitle,\n\temptyStateSubtitle = 'Here are some things you can try',\n\tsuggestions,\n\tonSuggestionClick,\n\tshowRefresh = true,\n\tonRefresh,\n\tonRegenerate,\n\tonFeedback,\n\tdislikeTitle,\n\tdislikeSubtitle,\n\tdislikeReasons,\n\tdislikeNotePlaceholder,\n\tdislikeSubmitLabel,\n\tisThinking = false,\n\tthinkingLabel = 'Thinking',\n\tisStreaming = false,\n\tonStop,\n\tinterruptedLabel = 'This message was interrupted',\n\tfollowUpsLabel = 'Follow ups',\n\tonToolCtaClick,\n\thasMoreHistory = false,\n\tisLoadingHistory = false,\n\tonLoadOlderMessages,\n\thistoryLoadingLabel = 'Loading earlier messages',\n\tinputDisabled = false,\n\tattachment,\n\tonAttachmentRemove,\n\terrorMessage,\n\twidth,\n\theight,\n\tclassName,\n\tstyle,\n}) => {\n\tconst [input, setInput] = useState('');\n\tconst [isInputFocused, setIsInputFocused] = useState(false);\n\tconst [isAtLatest, setIsAtLatest] = useState(true);\n\t// Which reply is showing \"Copied\" — per message, so copying one does not tick\n\t// the button under another.\n\tconst [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n\n\tconst [feedback, setFeedback] = useState<\n\t\tRecord<string, 'like' | 'dislike' | undefined>\n\t>({});\n\t// Which reply is being asked about. A thumbs-down opens the prompt and the\n\t// rating is reported once it is answered or dismissed -- so pressing the\n\t// thumb is never lost, and one thumb never becomes two ratings.\n\tconst [dislikePromptId, setDislikePromptId] = useState<string | null>(null);\n\tconst inputRef = useRef<HTMLTextAreaElement>(null);\n\tconst copiedTimeoutRef = useRef<number | null>(null);\n\tconst bottomRef = useRef<HTMLDivElement>(null);\n\tconst scrollerRef = useRef<HTMLDivElement>(null);\n\tconst lastScrollTopRef = useRef(0);\n\t// Distance from the bottom at the moment an older page was asked for. Older\n\t// messages land *above* the viewport, so without restoring against this the\n\t// content under the reader jumps down by the height of what arrived.\n\tconst anchorFromBottomRef = useRef<number | null>(null);\n\n\t// An assistant bubble is pushed the moment a turn starts, before any text has\n\t// arrived; the thinking indicator stands in for it until then, so rendering it\n\t// too would show an empty balloon next to the dots. A turn stopped before its\n\t// first token keeps its place, carrying only the interrupted note.\n\tconst visibleMessages = messages.filter(\n\t\t(message) =>\n\t\t\t(message.content.length > 0 || message.wasInterrupted) &&\n\t\t\t!isCopilotRegeneratePrompt(message.content),\n\t);\n\tconst isEmpty = visibleMessages.length === 0 && !isThinking;\n\tconst isTurnInFlight = isThinking || isStreaming;\n\tconst canSend =\n\t\t!inputDisabled &&\n\t\t!isTurnInFlight &&\n\t\t(input.trim().length > 0 || Boolean(attachment));\n\t// Stopping is the only thing the button can do mid-answer, so it becomes the\n\t// stop button rather than sitting there disabled.\n\tconst canStop = isTurnInFlight && Boolean(onStop);\n\t// Only the newest reply's suggestions are on offer — older ones answer a\n\t// question the conversation has already moved past.\n\tconst newestMessage = visibleMessages[visibleMessages.length - 1];\n\tconst followUps =\n\t\t!isTurnInFlight && newestMessage?.role === 'assistant'\n\t\t\t? newestMessage.followUps\n\t\t\t: undefined;\n\t// A long answer that the reader has scrolled up from: the tail is clipped, so\n\t// the fade and the arrow say there is more below.\n\tconst showScrollAffordance = !isEmpty && !isAtLatest;\n\n\t// Following the conversation is the default, but a reader who has scrolled up\n\t// mid-answer must not be yanked back down by the next chunk.\n\tuseEffect(() => {\n\t\tif (!isAtLatest) {\n\t\t\treturn;\n\t\t}\n\t\tbottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t}, [messages, isThinking, isAtLatest]);\n\n\t// Older messages have landed: put the reader back on the message they were\n\t// looking at, which is now that much further down.\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tconst anchor = anchorFromBottomRef.current;\n\t\tif (!scroller || anchor === null || isLoadingHistory) {\n\t\t\treturn;\n\t\t}\n\t\tanchorFromBottomRef.current = null;\n\t\tscroller.scrollTop = scroller.scrollHeight - anchor;\n\t\tlastScrollTopRef.current = scroller.scrollTop;\n\t}, [messages, isLoadingHistory]);\n\n\tconst handleScroll = () => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) {\n\t\t\treturn;\n\t\t}\n\t\tconst distanceFromBottom =\n\t\t\tscroller.scrollHeight - scroller.scrollTop - scroller.clientHeight;\n\n\t\t// Reaching the top asks for the page before this one. The threshold gives\n\t\t// the request a head start, so the page is usually there by the time the\n\t\t// reader arrives.\n\t\tif (\n\t\t\tscroller.scrollTop <= NEAR_TOP_TOLERANCE_PX &&\n\t\t\thasMoreHistory &&\n\t\t\t!isLoadingHistory &&\n\t\t\tonLoadOlderMessages\n\t\t) {\n\t\t\tanchorFromBottomRef.current = scroller.scrollHeight - scroller.scrollTop;\n\t\t\tonLoadOlderMessages();\n\t\t}\n\t\t// Scrolling *up* is the only thing that detaches from the latest message:\n\t\t// growing content also pushes the bottom away, and auto-scroll itself only\n\t\t// ever moves down, so distance alone would flap mid-stream.\n\t\tconst scrolledUp = scroller.scrollTop < lastScrollTopRef.current - 1;\n\t\tlastScrollTopRef.current = scroller.scrollTop;\n\n\t\tif (distanceFromBottom <= AT_BOTTOM_TOLERANCE_PX) {\n\t\t\tsetIsAtLatest(true);\n\t\t\treturn;\n\t\t}\n\t\tif (scrolledUp) {\n\t\t\tsetIsAtLatest(false);\n\t\t}\n\t};\n\n\tconst handleJumpToLatest = () => {\n\t\tsetIsAtLatest(true);\n\t\tbottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t};\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tif (copiedTimeoutRef.current) {\n\t\t\t\twindow.clearTimeout(copiedTimeoutRef.current);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleCopyMessage = async (\n\t\tmessage: CopilotPanelProps['messages'][number],\n\t) => {\n\t\t// The raw markdown, not the rendered HTML — that is what a reader wants to\n\t\t// paste into a doc or a ticket.\n\t\tconst copied = await writeToClipboard(message.content);\n\t\tif (!copied) {\n\t\t\treturn;\n\t\t}\n\t\tif (copiedTimeoutRef.current) {\n\t\t\twindow.clearTimeout(copiedTimeoutRef.current);\n\t\t}\n\t\tsetCopiedMessageId(message.id);\n\t\tcopiedTimeoutRef.current = window.setTimeout(\n\t\t\t() => setCopiedMessageId(null),\n\t\t\tCOPIED_FEEDBACK_MS,\n\t\t);\n\t};\n\n\tconst handleFeedback = (messageId: string, vote: 'like' | 'dislike') => {\n\t\t// Pressing the same thumb again clears the vote. Nothing is reported for\n\t\t// that: the backend records ratings, not their absence.\n\t\tconst cleared = feedback[messageId] === vote;\n\t\tsetFeedback((previous) => ({\n\t\t\t...previous,\n\t\t\t[messageId]: previous[messageId] === vote ? undefined : vote,\n\t\t}));\n\t\t// Everything below sits outside the updater on purpose: React may run an\n\t\t// updater twice, which would report the same vote twice.\n\t\tif (cleared) {\n\t\t\tif (vote === 'dislike') {\n\t\t\t\tsetDislikePromptId((current) =>\n\t\t\t\t\tcurrent === messageId ? null : current,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (vote === 'like') {\n\t\t\tonFeedback?.(messageId, 'like');\n\t\t\treturn;\n\t\t}\n\t\t// A thumbs-down asks what went wrong first. Moving the prompt to another\n\t\t// reply still records the one it is leaving.\n\t\tif (dislikePromptId && dislikePromptId !== messageId) {\n\t\t\tonFeedback?.(dislikePromptId, 'dislike');\n\t\t}\n\t\tsetDislikePromptId(messageId);\n\t};\n\n\tconst reportDislike = (messageId: string, detail?: CopilotFeedbackDetail) => {\n\t\tsetDislikePromptId((current) => (current === messageId ? null : current));\n\t\tonFeedback?.(messageId, 'dislike', detail);\n\t};\n\n\tconst handleRegenerate = () => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonRegenerate?.();\n\t};\n\n\tconst handleSend = () => {\n\t\tconst trimmed = input.trim();\n\t\tif ((!trimmed && !attachment) || inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\t// The endpoint has no context field, so a quoted selection has to ride\n\t\t// inside the prompt itself.\n\t\tonSend(\n\t\t\tattachment ? buildCopilotSelectionPrompt(attachment, trimmed) : trimmed,\n\t\t);\n\t\tsetInput('');\n\t\t// The quote belongs to the turn that used it; the next question starts\n\t\t// clean unless the merchant selects something again.\n\t\tonAttachmentRemove?.();\n\t\tconst textarea = inputRef.current;\n\t\tif (textarea) {\n\t\t\ttextarea.style.height = 'auto';\n\t\t}\n\t};\n\n\t// A selection is attached so the merchant can ask about it, so the caret\n\t// should already be waiting for the question.\n\tuseEffect(() => {\n\t\tif (attachment) {\n\t\t\tinputRef.current?.focus();\n\t\t}\n\t}, [attachment]);\n\n\tconst handleInputChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\tsetInput(event.target.value);\n\t\tconst textarea = event.target;\n\t\ttextarea.style.height = 'auto';\n\t\ttextarea.style.height = `${Math.min(\n\t\t\ttextarea.scrollHeight,\n\t\t\tMAX_INPUT_HEIGHT_PX,\n\t\t)}px`;\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\tif (event.key === 'Enter' && !event.shiftKey) {\n\t\t\tevent.preventDefault();\n\t\t\thandleSend();\n\t\t}\n\t};\n\n\tconst handleSuggestionClick = (\n\t\tsuggestion: NonNullable<CopilotPanelProps['suggestions']>[number],\n\t) => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonSuggestionClick?.(suggestion);\n\t\tonSend(suggestion.text);\n\t};\n\n\tconst handleFollowUpClick = (followUp: string) => {\n\t\tif (inputDisabled || isTurnInFlight) {\n\t\t\treturn;\n\t\t}\n\t\tonSend(followUp);\n\t};\n\n\treturn (\n\t\t<PanelContainer\n\t\t\tclassName={className}\n\t\t\tstyle={{ width, height, ...style }}\n\t\t\trole=\"dialog\"\n\t\t\taria-label={title}\n\t\t>\n\t\t\t<PanelHeader>\n\t\t\t\t<HeaderAvatar>\n\t\t\t\t\t{avatar ?? <AiStarsIcon width={18} height={18} />}\n\t\t\t\t</HeaderAvatar>\n\t\t\t\t<HeaderText>\n\t\t\t\t\t<HeaderTitleRow>\n\t\t\t\t\t\t<TitleSmall>{title}</TitleSmall>\n\t\t\t\t\t\t{badge && <HeaderBadge>{badge}</HeaderBadge>}\n\t\t\t\t\t</HeaderTitleRow>\n\t\t\t\t\t{subtitle && (\n\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t)}\n\t\t\t\t</HeaderText>\n\t\t\t\t<HeaderActions>\n\t\t\t\t\t{showRefresh && onRefresh && (\n\t\t\t\t\t\t<IconAction\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRefresh}\n\t\t\t\t\t\t\taria-label=\"Start a new conversation\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshIcon width={16} height={16} />\n\t\t\t\t\t\t</IconAction>\n\t\t\t\t\t)}\n\t\t\t\t\t<IconAction\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close copilot\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<CrossIcon width={18} height={18} />\n\t\t\t\t\t</IconAction>\n\t\t\t\t</HeaderActions>\n\t\t\t</PanelHeader>\n\n\t\t\t<MessagesViewport>\n\t\t\t\t<MessagesArea\n\t\t\t\t\tref={scrollerRef}\n\t\t\t\t\tonScroll={handleScroll}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Conversation\"\n\t\t\t\t>\n\t\t\t\t\t{isEmpty ? (\n\t\t\t\t\t\t<EmptyState>\n\t\t\t\t\t\t\t<EmptyStateIcon>\n\t\t\t\t\t\t\t\t<AiStarsIcon width={28} height={28} />\n\t\t\t\t\t\t\t</EmptyStateIcon>\n\t\t\t\t\t\t\t<BodySecondary style={{ fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t{emptyStateTitle || title}\n\t\t\t\t\t\t\t</BodySecondary>\n\t\t\t\t\t\t\t{emptyStateSubtitle && (\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t\t\t\t\t{emptyStateSubtitle}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{suggestions && suggestions.length > 0 && (\n\t\t\t\t\t\t\t\t<SuggestionList>\n\t\t\t\t\t\t\t\t\t{suggestions.map((suggestion) => (\n\t\t\t\t\t\t\t\t\t\t<SuggestionChip\n\t\t\t\t\t\t\t\t\t\t\tkey={suggestion.id}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled || isTurnInFlight}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSuggestionClick(suggestion)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<AiStarsIcon width={14} height={14} />\n\t\t\t\t\t\t\t\t\t\t\t{suggestion.text}\n\t\t\t\t\t\t\t\t\t\t</SuggestionChip>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</SuggestionList>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</EmptyState>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{isLoadingHistory && (\n\t\t\t\t\t\t\t\t<HistoryLoader role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t<DotPulse color={COLORS.content.placeholder} size={4} />\n\t\t\t\t\t\t\t\t\t{historyLoadingLabel}\n\t\t\t\t\t\t\t\t</HistoryLoader>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{visibleMessages.map((message) => {\n\t\t\t\t\t\t\t\tconst sentAt =\n\t\t\t\t\t\t\t\t\tmessage.role === 'user'\n\t\t\t\t\t\t\t\t\t\t? formatMessageTime(message.timestamp)\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<React.Fragment key={message.id}>\n\t\t\t\t\t\t\t\t\t\t{message.content.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<MessageBubble $role={message.role}>\n\t\t\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t__html: renderCopilotMarkdown(message.content),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div style={{ whiteSpace: 'pre-wrap' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{message.content}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</MessageBubble>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{/* Tool CTAs (e.g. the support-portal link) — only once the\n\t\t\t\t\t\t\t\t\t\t reply has finished, so a button cannot flash mid-stream. */}\n\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' &&\n\t\t\t\t\t\t\t\t\t\t\t!message.isStreaming &&\n\t\t\t\t\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst ctas = toolResultCtas(message.toolResults);\n\t\t\t\t\t\t\t\t\t\t\t\tif (ctas.length === 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolCtaList>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ctas.map((cta) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolCtaLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${cta.tool}-${cta.url}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thref={cta.url}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonToolCtaClick?.({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttool: cta.tool,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turl: cta.url,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{cta.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ToolCtaLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ToolCtaList>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t\t\t\t\t{sentAt && <MessageTimestamp>{sentAt}</MessageTimestamp>}\n\t\t\t\t\t\t\t\t\t\t{message.wasInterrupted && interruptedLabel && (\n\t\t\t\t\t\t\t\t\t\t\t<InterruptedNote>\n\t\t\t\t\t\t\t\t\t\t\t\t<StopIcon size={12} />\n\t\t\t\t\t\t\t\t\t\t\t\t{interruptedLabel}\n\t\t\t\t\t\t\t\t\t\t\t</InterruptedNote>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{/* Only under a finished reply: mid-stream the text is still\n\t\t\t\t\t\t\t\t\t\t changing, so copying it would capture a partial answer. */}\n\t\t\t\t\t\t\t\t\t\t{message.role === 'assistant' &&\n\t\t\t\t\t\t\t\t\t\t\tmessage.content.length > 0 &&\n\t\t\t\t\t\t\t\t\t\t\t!message.isStreaming && (\n\t\t\t\t\t\t\t\t\t\t\t\t<MessageActions>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void handleCopyMessage(message)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-copied={copiedMessageId === message.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcopiedMessageId === message.id ? 'Copied' : 'Copy'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcopiedMessageId === message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Response copied to clipboard'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'Copy response'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{copiedMessageId === message.id ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CopyIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/* Only under the newest reply: regenerating appends a\n\t\t\t\t\t\t\t\t\t\t\t\t\t fresh turn at the end, so offering it against an\n\t\t\t\t\t\t\t\t\t\t\t\t\t older answer would not replace that answer. */}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{onRegenerate && message.id === newestMessage?.id && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleRegenerate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled || isTurnInFlight}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Regenerate\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Regenerate response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<RegenerateIcon />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(message.id, 'like')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-selected={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-pressed={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Good response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Good response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ThumbUpIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilled={feedback[message.id] === 'like'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageAction\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleFeedback(message.id, 'dislike')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-selected={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-pressed={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Bad response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Bad response\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ThumbDownIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilled={feedback[message.id] === 'dislike'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageAction>\n\t\t\t\t\t\t\t\t\t\t\t\t</MessageActions>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{dislikePromptId === message.id && (\n\t\t\t\t\t\t\t\t\t\t\t<CopilotFeedbackModal\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={dislikeTitle}\n\t\t\t\t\t\t\t\t\t\t\t\tsubtitle={dislikeSubtitle ?? `Help us improve ${title}`}\n\t\t\t\t\t\t\t\t\t\t\t\treasons={dislikeReasons}\n\t\t\t\t\t\t\t\t\t\t\t\tnotePlaceholder={dislikeNotePlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\tsubmitLabel={dislikeSubmitLabel}\n\t\t\t\t\t\t\t\t\t\t\t\tonSubmit={(detail) => reportDislike(message.id, detail)}\n\t\t\t\t\t\t\t\t\t\t\t\tonDismiss={() => reportDislike(message.id)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t{followUps && followUps.length > 0 && (\n\t\t\t\t\t\t\t\t<FollowUpList>\n\t\t\t\t\t\t\t\t\t{followUpsLabel && (\n\t\t\t\t\t\t\t\t\t\t<FollowUpsLabel>{followUpsLabel}</FollowUpsLabel>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{followUps.map((followUp) => (\n\t\t\t\t\t\t\t\t\t\t<FollowUpChip\n\t\t\t\t\t\t\t\t\t\t\tkey={followUp}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={inputDisabled}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleFollowUpClick(followUp)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ArrowRightIcon />\n\t\t\t\t\t\t\t\t\t\t\t{followUp}\n\t\t\t\t\t\t\t\t\t\t</FollowUpChip>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</FollowUpList>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{isThinking && (\n\t\t\t\t\t\t\t\t<ThinkingBubble role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t<AiStarsIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.brand}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{thinkingLabel && (\n\t\t\t\t\t\t\t\t\t\t<ThinkingLabel>{thinkingLabel}</ThinkingLabel>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<DotPulse color={COLORS.background.brand} size={5} />\n\t\t\t\t\t\t\t\t</ThinkingBubble>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div ref={bottomRef} />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</MessagesArea>\n\n\t\t\t\t<ScrollFade $visible={showScrollAffordance} aria-hidden=\"true\" />\n\t\t\t\t<JumpToLatestButton\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t$visible={showScrollAffordance}\n\t\t\t\t\tonClick={handleJumpToLatest}\n\t\t\t\t\ttabIndex={showScrollAffordance ? 0 : -1}\n\t\t\t\t\taria-label=\"Scroll to the latest message\"\n\t\t\t\t>\n\t\t\t\t\t<ArrowDownIcon width={16} height={16} />\n\t\t\t\t</JumpToLatestButton>\n\t\t\t</MessagesViewport>\n\n\t\t\t{errorMessage && <ErrorBanner role=\"alert\">{errorMessage}</ErrorBanner>}\n\n\t\t\t<InputArea>\n\t\t\t\t{attachment && (\n\t\t\t\t\t<AttachmentChip>\n\t\t\t\t\t\t<AiStarsIcon width={14} height={14} color={COLORS.content.brand} />\n\t\t\t\t\t\t<AttachmentText title={attachment}>{attachment}</AttachmentText>\n\t\t\t\t\t\t<AttachmentRemove\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onAttachmentRemove}\n\t\t\t\t\t\t\taria-label=\"Remove the selected text\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<CrossIcon width={12} height={12} />\n\t\t\t\t\t\t</AttachmentRemove>\n\t\t\t\t\t</AttachmentChip>\n\t\t\t\t)}\n\t\t\t\t<InputWrapper $focused={isInputFocused}>\n\t\t\t\t\t<MessageInput\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\trows={1}\n\t\t\t\t\t\tvalue={input}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdisabled={inputDisabled}\n\t\t\t\t\t\tonChange={handleInputChange}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tonFocus={() => setIsInputFocused(true)}\n\t\t\t\t\t\tonBlur={() => setIsInputFocused(false)}\n\t\t\t\t\t/>\n\t\t\t\t\t<SendButton\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t$active={canStop || canSend}\n\t\t\t\t\t\tdisabled={!canStop && !canSend}\n\t\t\t\t\t\tonClick={canStop ? onStop : handleSend}\n\t\t\t\t\t\taria-label={canStop ? 'Stop generating' : 'Send message'}\n\t\t\t\t\t>\n\t\t\t\t\t\t{canStop ? <StopIcon /> : <SendArrowIcon />}\n\t\t\t\t\t</SendButton>\n\t\t\t\t</InputWrapper>\n\t\t\t</InputArea>\n\n\t\t\t{disclaimer && <Disclaimer>{disclaimer}</Disclaimer>}\n\t\t</PanelContainer>\n\t);\n};\n\nexport default CopilotPanel;\n"],"names":["MAX_INPUT_HEIGHT_PX","AT_BOTTOM_TOLERANCE_PX","COPIED_FEEDBACK_MS","writeToClipboard","text","textarea","copied","NEAR_TOP_TOLERANCE_PX","formatMessageTime","timestamp","date","SendArrowIcon","jsxs","jsx","ArrowRightIcon","StopIcon","size","CopyIcon","CheckIcon","RegenerateIcon","ThumbUpIcon","filled","ThumbDownIcon","CopilotPanel","messages","onSend","onClose","title","badge","subtitle","avatar","placeholder","disclaimer","emptyStateTitle","emptyStateSubtitle","suggestions","onSuggestionClick","showRefresh","onRefresh","onRegenerate","onFeedback","dislikeTitle","dislikeSubtitle","dislikeReasons","dislikeNotePlaceholder","dislikeSubmitLabel","isThinking","thinkingLabel","isStreaming","onStop","interruptedLabel","followUpsLabel","onToolCtaClick","hasMoreHistory","isLoadingHistory","onLoadOlderMessages","historyLoadingLabel","inputDisabled","attachment","onAttachmentRemove","errorMessage","width","height","className","style","input","setInput","useState","isInputFocused","setIsInputFocused","isAtLatest","setIsAtLatest","copiedMessageId","setCopiedMessageId","feedback","setFeedback","dislikePromptId","setDislikePromptId","inputRef","useRef","copiedTimeoutRef","bottomRef","scrollerRef","lastScrollTopRef","anchorFromBottomRef","visibleMessages","message","isCopilotRegeneratePrompt","isEmpty","isTurnInFlight","canSend","canStop","newestMessage","followUps","showScrollAffordance","useEffect","scroller","anchor","handleScroll","distanceFromBottom","scrolledUp","handleJumpToLatest","handleCopyMessage","handleFeedback","messageId","vote","cleared","previous","current","reportDislike","detail","handleRegenerate","handleSend","trimmed","buildCopilotSelectionPrompt","handleInputChange","event","handleKeyDown","handleSuggestionClick","suggestion","handleFollowUpClick","followUp","PanelContainer","PanelHeader","HeaderAvatar","AiStarsIcon","HeaderText","HeaderTitleRow","TitleSmall","HeaderBadge","BodyCaption","COLORS","HeaderActions","IconAction","RefreshIcon","CrossIcon","MessagesViewport","MessagesArea","EmptyState","EmptyStateIcon","BodySecondary","SuggestionList","SuggestionChip","Fragment","HistoryLoader","DotPulse","sentAt","React","MessageBubble","renderCopilotMarkdown","ctas","toolResultCtas","ToolCtaList","cta","ToolCtaLink","MessageTimestamp","InterruptedNote","MessageActions","MessageAction","CopilotFeedbackModal","FollowUpList","FollowUpsLabel","FollowUpChip","ThinkingBubble","ThinkingLabel","ScrollFade","JumpToLatestButton","ArrowDownIcon","ErrorBanner","InputArea","AttachmentChip","AttachmentText","AttachmentRemove","InputWrapper","MessageInput","SendButton","Disclaimer"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("styled-components"),e=require("../../constants/Theme.js"),a=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},t=a(r),i="#F9F9F9",o=12,s=8,d=t.default.div`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("styled-components"),e=require("../../constants/Theme.js"),a=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},t=a(r),i="#F9F9F9",o=12,d=8,s=t.default.div`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  min-height: 0;
@@ -205,7 +205,7 @@
205
205
  cursor: not-allowed;
206
206
  opacity: 0.5;
207
207
  }
208
- `,$=t.default.div`
208
+ `,C=t.default.div`
209
209
  font-family: Inter;
210
210
  font-size: 14px;
211
211
  line-height: 20px;
@@ -274,7 +274,7 @@
274
274
  padding: 1px 4px;
275
275
  font-size: 12px;
276
276
  }
277
- `,C=t.default.div`
277
+ `,$=t.default.div`
278
278
  align-self: flex-start;
279
279
  display: inline-flex;
280
280
  align-items: center;
@@ -366,7 +366,7 @@
366
366
  cursor: not-allowed;
367
367
  opacity: 0.5;
368
368
  }
369
- `,M=t.default.div`
369
+ `,T=t.default.div`
370
370
  align-self: flex-start;
371
371
  display: inline-flex;
372
372
  align-items: center;
@@ -380,7 +380,7 @@
380
380
  flex-shrink: 0;
381
381
  color: ${e.COLORS.content.inactive};
382
382
  }
383
- `,T=t.default.div`
383
+ `,M=t.default.div`
384
384
  align-self: flex-end;
385
385
  margin-top: -6px;
386
386
  font-family: Inter;
@@ -393,7 +393,7 @@
393
393
  align-items: center;
394
394
  gap: 2px;
395
395
  /* Pulls back out of the scroller's row gap to land on 8px. */
396
- margin-top: ${s-o}px;
396
+ margin-top: ${d-o}px;
397
397
  `,B=t.default.button`
398
398
  display: inline-flex;
399
399
  align-items: center;
@@ -458,10 +458,51 @@
458
458
  font-size: 12px;
459
459
  line-height: 18px;
460
460
  flex-shrink: 0;
461
- `,P=t.default.div`
461
+ `,j=t.default.div`
462
462
  padding: 16px 16px 4px;
463
463
  flex-shrink: 0;
464
- `,_=t.default.div`
464
+ `,P=t.default.div`
465
+ box-sizing: border-box;
466
+ display: flex;
467
+ align-items: center;
468
+ gap: 6px;
469
+ margin-bottom: 8px;
470
+ padding: 6px 8px;
471
+ border: 1px solid ${e.COLORS.stroke.primary};
472
+ border-radius: 8px;
473
+ background: ${e.COLORS.background.brandVeryLight};
474
+
475
+ svg {
476
+ flex-shrink: 0;
477
+ }
478
+ `,_=t.default.span`
479
+ flex: 1;
480
+ min-width: 0;
481
+ overflow: hidden;
482
+ white-space: nowrap;
483
+ text-overflow: ellipsis;
484
+ font-family: Inter;
485
+ font-size: 12px;
486
+ line-height: 16px;
487
+ color: ${e.COLORS.content.primary};
488
+ `,U=t.default.button`
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ flex-shrink: 0;
493
+ width: 16px;
494
+ height: 16px;
495
+ padding: 0;
496
+ border: none;
497
+ border-radius: 4px;
498
+ background: transparent;
499
+ color: ${e.COLORS.content.secondary};
500
+ cursor: pointer;
501
+
502
+ &:hover {
503
+ background: ${e.COLORS.background.brandLight};
504
+ }
505
+ `,V=t.default.div`
465
506
  box-sizing: border-box;
466
507
  min-height: 48px;
467
508
  display: flex;
@@ -478,7 +519,7 @@
478
519
  box-shadow: inset 0 0 0 1px
479
520
  ${n=>n.$focused?e.COLORS.stroke.brand:e.COLORS.content.inactive};
480
521
  }
481
- `,j=t.default.textarea`
522
+ `,G=t.default.textarea`
482
523
  flex: 1;
483
524
  border: none;
484
525
  outline: none;
@@ -499,7 +540,7 @@
499
540
  &:disabled {
500
541
  cursor: not-allowed;
501
542
  }
502
- `,U=t.default.button`
543
+ `,D=t.default.button`
503
544
  width: 24px;
504
545
  height: 24px;
505
546
  flex-shrink: 0;
@@ -522,7 +563,7 @@
522
563
  outline: 2px solid ${e.COLORS.stroke.brand};
523
564
  outline-offset: 1px;
524
565
  }
525
- `,G=t.default.div`
566
+ `,N=t.default.div`
526
567
  padding: 4px 16px 16px;
527
568
  text-align: center;
528
569
  font-family: Inter;
@@ -530,5 +571,5 @@
530
571
  line-height: 16px;
531
572
  color: ${e.COLORS.content.placeholder};
532
573
  flex-shrink: 0;
533
- `;exports.Disclaimer=G;exports.EmptyState=k;exports.EmptyStateIcon=y;exports.ErrorBanner=F;exports.FollowUpChip=z;exports.FollowUpList=R;exports.FollowUpsLabel=w;exports.HeaderActions=u;exports.HeaderAvatar=p;exports.HeaderBadge=g;exports.HeaderText=c;exports.HeaderTitleRow=x;exports.HistoryLoader=v;exports.IconAction=f;exports.InputArea=P;exports.InputWrapper=_;exports.InterruptedNote=M;exports.JumpToLatestButton=m;exports.MessageAction=B;exports.MessageActions=H;exports.MessageBubble=$;exports.MessageInput=j;exports.MessageTimestamp=T;exports.MessagesArea=O;exports.MessagesViewport=b;exports.PanelContainer=d;exports.PanelHeader=l;exports.ScrollFade=h;exports.SendButton=U;exports.SuggestionChip=S;exports.SuggestionList=L;exports.ThinkingBubble=C;exports.ThinkingLabel=E;exports.ToolCtaLink=A;exports.ToolCtaList=I;
574
+ `;exports.AttachmentChip=P;exports.AttachmentRemove=U;exports.AttachmentText=_;exports.Disclaimer=N;exports.EmptyState=k;exports.EmptyStateIcon=y;exports.ErrorBanner=F;exports.FollowUpChip=z;exports.FollowUpList=R;exports.FollowUpsLabel=w;exports.HeaderActions=u;exports.HeaderAvatar=p;exports.HeaderBadge=g;exports.HeaderText=c;exports.HeaderTitleRow=x;exports.HistoryLoader=v;exports.IconAction=f;exports.InputArea=j;exports.InputWrapper=V;exports.InterruptedNote=T;exports.JumpToLatestButton=m;exports.MessageAction=B;exports.MessageActions=H;exports.MessageBubble=C;exports.MessageInput=G;exports.MessageTimestamp=M;exports.MessagesArea=O;exports.MessagesViewport=b;exports.PanelContainer=s;exports.PanelHeader=l;exports.ScrollFade=h;exports.SendButton=D;exports.SuggestionChip=S;exports.SuggestionList=L;exports.ThinkingBubble=$;exports.ThinkingLabel=E;exports.ToolCtaLink=A;exports.ToolCtaList=I;
534
575
  //# sourceMappingURL=CopilotPanel.styled.js.map