@assistant-ui/react 0.14.26 → 0.14.28

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 (496) hide show
  1. package/README.md +1 -1
  2. package/dist/augmentations.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.d.ts +6 -4
  4. package/dist/client/ExternalThread.d.ts.map +1 -1
  5. package/dist/client/ExternalThread.js +4 -3
  6. package/dist/client/ExternalThread.js.map +1 -1
  7. package/dist/client/InMemoryThreadList.d.ts +0 -1
  8. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  9. package/dist/client/InMemoryThreadList.js +4 -1
  10. package/dist/client/InMemoryThreadList.js.map +1 -1
  11. package/dist/client/SingleThreadList.d.ts +0 -1
  12. package/dist/client/SingleThreadList.d.ts.map +1 -1
  13. package/dist/context/ReadonlyStore.d.ts +0 -1
  14. package/dist/context/ReadonlyStore.d.ts.map +1 -1
  15. package/dist/context/providers/MessageProvider.d.ts +0 -1
  16. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  17. package/dist/context/providers/ThreadViewportProvider.d.ts +0 -1
  18. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  19. package/dist/context/react/ThreadViewportContext.d.ts +15 -16
  20. package/dist/context/react/ThreadViewportContext.d.ts.map +1 -1
  21. package/dist/context/react/utils/createContextHook.d.ts +0 -1
  22. package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
  23. package/dist/context/react/utils/createContextStoreHook.d.ts +2 -3
  24. package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
  25. package/dist/context/react/utils/createStateHookForRuntime.d.ts +0 -1
  26. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -1
  27. package/dist/context/react/utils/ensureBinding.d.ts.map +1 -1
  28. package/dist/context/react/utils/useRuntimeState.d.ts +0 -1
  29. package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -1
  30. package/dist/context/stores/ThreadViewport.d.ts +25 -15
  31. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  32. package/dist/devtools/DevToolsHooks.d.ts +0 -1
  33. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  34. package/dist/hooks/useMessageQuote.d.ts +0 -1
  35. package/dist/hooks/useMessageQuote.d.ts.map +1 -1
  36. package/dist/hooks/useMessageTiming.d.ts +0 -1
  37. package/dist/hooks/useMessageTiming.d.ts.map +1 -1
  38. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -1
  39. package/dist/index.d.ts +5 -3
  40. package/dist/internal.d.ts +0 -2
  41. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts +0 -1
  42. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  43. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  44. package/dist/legacy-runtime/cloud/auiV0.d.ts +11 -2
  45. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  46. package/dist/legacy-runtime/cloud/auiV0.js +31 -2
  47. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  48. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -5
  49. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  50. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +0 -1
  51. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
  52. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +12 -13
  53. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
  54. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +0 -1
  55. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
  56. package/dist/legacy-runtime/hooks/MessageContext.d.ts +0 -1
  57. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
  58. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +0 -1
  59. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
  60. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +0 -1
  61. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  62. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +0 -1
  63. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +0 -1
  65. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
  66. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +1 -4
  67. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  68. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  69. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +0 -1
  70. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  71. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +0 -1
  72. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  73. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts +0 -1
  74. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts.map +1 -1
  75. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts.map +1 -1
  76. package/dist/mcp-apps/McpAppRenderer.d.ts +12 -7
  77. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  78. package/dist/mcp-apps/McpAppRenderer.js +29 -7
  79. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  80. package/dist/mcp-apps/McpAppsRemoteHost.d.ts +0 -1
  81. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  82. package/dist/mcp-apps/McpAppsRemoteHost.js +32 -1
  83. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  84. package/dist/mcp-apps/app-frame.d.ts +1 -12
  85. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  86. package/dist/mcp-apps/app-frame.js +1 -1
  87. package/dist/mcp-apps/app-frame.js.map +1 -1
  88. package/dist/mcp-apps/bridge.d.ts +0 -1
  89. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  90. package/dist/mcp-apps/bridge.js +4 -3
  91. package/dist/mcp-apps/bridge.js.map +1 -1
  92. package/dist/mcp-apps/types.d.ts +10 -7
  93. package/dist/mcp-apps/types.d.ts.map +1 -1
  94. package/dist/mcp-apps/types.js.map +1 -1
  95. package/dist/mcp-apps/utils.d.ts +0 -1
  96. package/dist/mcp-apps/utils.d.ts.map +1 -1
  97. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -6
  98. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
  99. package/dist/model-context/makeAssistantVisible.d.ts +0 -1
  100. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  101. package/dist/model-context/makeAssistantVisible.js +7 -1
  102. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  103. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -4
  104. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  105. package/dist/primitives/actionBar/ActionBarEdit.d.ts +0 -1
  106. package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
  107. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -5
  108. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  109. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +0 -1
  110. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
  111. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +0 -1
  112. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
  113. package/dist/primitives/actionBar/ActionBarInteractionContext.d.ts.map +1 -1
  114. package/dist/primitives/actionBar/ActionBarReload.d.ts +0 -1
  115. package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
  116. package/dist/primitives/actionBar/ActionBarRoot.d.ts +0 -1
  117. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  118. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  119. package/dist/primitives/actionBar/ActionBarSpeak.d.ts +0 -1
  120. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  121. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +0 -1
  122. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  123. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts +1 -6
  124. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts.map +1 -1
  125. package/dist/primitives/actionBar.d.ts +0 -2
  126. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts +0 -1
  127. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
  128. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  129. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts +0 -1
  130. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
  131. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts +0 -1
  132. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts.map +1 -1
  133. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts +0 -1
  134. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
  135. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts +0 -1
  136. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
  137. package/dist/primitives/actionBarMore/scope.d.ts +0 -1
  138. package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
  139. package/dist/primitives/actionBarMore.d.ts +0 -2
  140. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +6 -4
  141. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  142. package/dist/primitives/assistantModal/AssistantModalAnchor.js +2 -2
  143. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  144. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +4 -2
  145. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  146. package/dist/primitives/assistantModal/AssistantModalContent.js +2 -1
  147. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  148. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +0 -1
  149. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
  150. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +6 -4
  151. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  152. package/dist/primitives/assistantModal/AssistantModalTrigger.js +2 -2
  153. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  154. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts +14 -0
  155. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts.map +1 -0
  156. package/dist/primitives/assistantModal/popoverRenderPrimitives.js +10 -0
  157. package/dist/primitives/assistantModal/popoverRenderPrimitives.js.map +1 -0
  158. package/dist/primitives/assistantModal/scope.d.ts +0 -1
  159. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  160. package/dist/primitives/assistantModal.d.ts +0 -2
  161. package/dist/primitives/attachment/AttachmentName.d.ts +0 -1
  162. package/dist/primitives/attachment/AttachmentName.d.ts.map +1 -1
  163. package/dist/primitives/attachment/AttachmentRemove.d.ts +0 -1
  164. package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
  165. package/dist/primitives/attachment/AttachmentRoot.d.ts +0 -1
  166. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  167. package/dist/primitives/attachment/AttachmentThumb.d.ts +0 -1
  168. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  169. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  170. package/dist/primitives/attachment.d.ts +0 -2
  171. package/dist/primitives/branchPicker/BranchPickerCount.d.ts +0 -1
  172. package/dist/primitives/branchPicker/BranchPickerCount.d.ts.map +1 -1
  173. package/dist/primitives/branchPicker/BranchPickerNext.d.ts +0 -1
  174. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  175. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts +0 -1
  176. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts.map +1 -1
  177. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +0 -1
  178. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  179. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +0 -1
  180. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  181. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  182. package/dist/primitives/branchPicker.d.ts +0 -2
  183. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +0 -1
  184. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  185. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +0 -1
  186. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
  187. package/dist/primitives/chainOfThought.d.ts +0 -2
  188. package/dist/primitives/composer/ComposerAddAttachment.d.ts +5 -6
  189. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  190. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +0 -1
  191. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  192. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  193. package/dist/primitives/composer/ComposerCancel.d.ts +0 -1
  194. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  195. package/dist/primitives/composer/ComposerCompactContext.d.ts +9 -0
  196. package/dist/primitives/composer/ComposerCompactContext.d.ts.map +1 -0
  197. package/dist/primitives/composer/ComposerCompactContext.js +11 -0
  198. package/dist/primitives/composer/ComposerCompactContext.js.map +1 -0
  199. package/dist/primitives/composer/ComposerDictate.d.ts +0 -1
  200. package/dist/primitives/composer/ComposerDictate.d.ts.map +1 -1
  201. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +0 -1
  202. package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
  203. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  204. package/dist/primitives/composer/ComposerInput.d.ts +0 -1
  205. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  206. package/dist/primitives/composer/ComposerInput.js +17 -2
  207. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  208. package/dist/primitives/composer/ComposerInputPluginContext.d.ts +4 -3
  209. package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
  210. package/dist/primitives/composer/ComposerQuote.d.ts +0 -1
  211. package/dist/primitives/composer/ComposerQuote.d.ts.map +1 -1
  212. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  213. package/dist/primitives/composer/ComposerRoot.d.ts +27 -3
  214. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  215. package/dist/primitives/composer/ComposerRoot.js +109 -30
  216. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  217. package/dist/primitives/composer/ComposerSend.d.ts +0 -1
  218. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  219. package/dist/primitives/composer/ComposerStopDictation.d.ts +0 -1
  220. package/dist/primitives/composer/ComposerStopDictation.d.ts.map +1 -1
  221. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +10 -5
  222. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  223. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  224. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts +5 -3
  225. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts.map +1 -1
  226. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +3 -2
  227. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  228. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts +0 -1
  229. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
  230. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts +0 -1
  231. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
  232. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  233. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts +3 -2
  234. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts.map +1 -1
  235. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts +0 -1
  236. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
  237. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  238. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +10 -6
  239. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  240. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +8 -5
  241. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  242. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  243. package/dist/primitives/composer/trigger/detectTrigger.d.ts +1 -1
  244. package/dist/primitives/composer/trigger/index.d.ts +0 -1
  245. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  246. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +5 -2
  247. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  248. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +7 -4
  249. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  250. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +13 -7
  251. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  252. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +7 -4
  253. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  254. package/dist/primitives/composer/useComposerInputState.d.ts.map +1 -1
  255. package/dist/primitives/composer.d.ts +0 -2
  256. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts +0 -1
  257. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -1
  258. package/dist/primitives/error/ErrorMessage.d.ts +0 -1
  259. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  260. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  261. package/dist/primitives/error/ErrorRoot.d.ts +0 -1
  262. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
  263. package/dist/primitives/error.d.ts +0 -2
  264. package/dist/primitives/message/MessageError.d.ts +0 -1
  265. package/dist/primitives/message/MessageError.d.ts.map +1 -1
  266. package/dist/primitives/message/MessageIf.d.ts +0 -1
  267. package/dist/primitives/message/MessageIf.d.ts.map +1 -1
  268. package/dist/primitives/message/MessageParts.d.ts +0 -1
  269. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  270. package/dist/primitives/message/MessageParts.js.map +1 -1
  271. package/dist/primitives/message/MessagePartsGrouped.d.ts +25 -12
  272. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  273. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  274. package/dist/primitives/message/MessageRoot.d.ts +0 -1
  275. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  276. package/dist/primitives/message.d.ts +0 -2
  277. package/dist/primitives/messagePart/MessagePartImage.d.ts +0 -1
  278. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  279. package/dist/primitives/messagePart/MessagePartText.d.ts +0 -1
  280. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  281. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  282. package/dist/primitives/messagePart/useMessagePartData.d.ts +3 -3
  283. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  284. package/dist/primitives/messagePart/useMessagePartData.js +3 -2
  285. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  286. package/dist/primitives/messagePart/useMessagePartFile.d.ts +5 -5
  287. package/dist/primitives/messagePart/useMessagePartFile.d.ts.map +1 -1
  288. package/dist/primitives/messagePart/useMessagePartFile.js +11 -3
  289. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  290. package/dist/primitives/messagePart/useMessagePartImage.d.ts +5 -5
  291. package/dist/primitives/messagePart/useMessagePartImage.d.ts.map +1 -1
  292. package/dist/primitives/messagePart/useMessagePartImage.js +10 -3
  293. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  294. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts +5 -5
  295. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts.map +1 -1
  296. package/dist/primitives/messagePart/useMessagePartReasoning.js +10 -3
  297. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  298. package/dist/primitives/messagePart/useMessagePartSource.d.ts +6 -4
  299. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -1
  300. package/dist/primitives/messagePart/useMessagePartSource.js +12 -3
  301. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  302. package/dist/primitives/messagePart/useMessagePartText.d.ts +6 -6
  303. package/dist/primitives/messagePart/useMessagePartText.d.ts.map +1 -1
  304. package/dist/primitives/messagePart/useMessagePartText.js +10 -3
  305. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  306. package/dist/primitives/messagePart.d.ts +0 -2
  307. package/dist/primitives/queueItem/QueueItemRemove.d.ts +0 -1
  308. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  309. package/dist/primitives/queueItem/QueueItemSteer.d.ts +0 -1
  310. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  311. package/dist/primitives/queueItem/QueueItemText.d.ts +0 -1
  312. package/dist/primitives/queueItem/QueueItemText.d.ts.map +1 -1
  313. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  314. package/dist/primitives/queueItem.d.ts +0 -2
  315. package/dist/primitives/reasoning/useScrollLock.d.ts +0 -1
  316. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
  317. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts +0 -1
  318. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts.map +1 -1
  319. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts +0 -1
  320. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts.map +1 -1
  321. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +2 -1
  322. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  323. package/dist/primitives/selectionToolbar.d.ts +0 -2
  324. package/dist/primitives/suggestion/SuggestionDescription.d.ts +0 -1
  325. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  326. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  327. package/dist/primitives/suggestion/SuggestionTitle.d.ts +0 -1
  328. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  329. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  330. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -5
  331. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  332. package/dist/primitives/suggestion.d.ts +0 -2
  333. package/dist/primitives/thread/ThreadEmpty.d.ts +0 -1
  334. package/dist/primitives/thread/ThreadEmpty.d.ts.map +1 -1
  335. package/dist/primitives/thread/ThreadIf.d.ts +0 -1
  336. package/dist/primitives/thread/ThreadIf.d.ts.map +1 -1
  337. package/dist/primitives/thread/ThreadRoot.d.ts +0 -1
  338. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  339. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -4
  340. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  341. package/dist/primitives/thread/ThreadSuggestion.d.ts +13 -14
  342. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  343. package/dist/primitives/thread/ThreadViewport.d.ts +0 -1
  344. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  345. package/dist/primitives/thread/ThreadViewport.js +53 -19
  346. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  347. package/dist/primitives/thread/ThreadViewportFooter.d.ts +0 -1
  348. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  349. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +2 -11
  350. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -1
  351. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -1
  352. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +4 -0
  353. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -1
  354. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +14 -1
  355. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  356. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +14 -5
  357. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -1
  358. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +14 -1
  359. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  360. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -1
  361. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -1
  362. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts +1 -7
  363. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  364. package/dist/primitives/thread/useThreadViewportAutoScroll.js +2 -1
  365. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  366. package/dist/primitives/thread.d.ts +0 -2
  367. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +0 -1
  368. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -1
  369. package/dist/primitives/threadList/ThreadListNew.d.ts +0 -1
  370. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  371. package/dist/primitives/threadList/ThreadListRoot.d.ts +0 -1
  372. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  373. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  374. package/dist/primitives/threadList.d.ts +0 -2
  375. package/dist/primitives/threadListFocusGroup.d.ts +0 -1
  376. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  377. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +0 -1
  378. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  379. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +0 -1
  380. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  381. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +0 -1
  382. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  383. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  384. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +0 -1
  385. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  386. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  387. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +0 -1
  388. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  389. package/dist/primitives/threadListItem.d.ts +0 -2
  390. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +0 -1
  391. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  392. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  393. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +0 -1
  394. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  395. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +0 -1
  396. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
  397. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  398. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +0 -1
  399. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  400. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +0 -1
  401. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  402. package/dist/primitives/threadListItemMore/scope.d.ts +0 -1
  403. package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
  404. package/dist/primitives/threadListItemMore.d.ts +0 -2
  405. package/dist/sandbox-host/SandboxHost.d.ts +1 -10
  406. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  407. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -1
  408. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  409. package/dist/tests/setup.d.ts +1 -1
  410. package/dist/unstable/useComposerInput.d.ts +2 -2
  411. package/dist/unstable/useComposerInput.d.ts.map +1 -1
  412. package/dist/unstable/useComposerInputHistory.d.ts +2 -2
  413. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -1
  414. package/dist/unstable/useLiveCompletionAdapter.d.ts +4 -3
  415. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  416. package/dist/unstable/useMentionAdapter.d.ts +19 -10
  417. package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
  418. package/dist/unstable/useMessageStallDetection.d.ts +3 -1
  419. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -1
  420. package/dist/unstable/useSlashCommandAdapter.d.ts +6 -4
  421. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  422. package/dist/utils/Primitive.d.ts +0 -1
  423. package/dist/utils/Primitive.d.ts.map +1 -1
  424. package/dist/utils/Primitive.js.map +1 -1
  425. package/dist/utils/RequireAtLeastOne.d.ts +1 -1
  426. package/dist/utils/RequireAtLeastOne.d.ts.map +1 -1
  427. package/dist/utils/createActionButton.d.ts +0 -1
  428. package/dist/utils/createActionButton.d.ts.map +1 -1
  429. package/dist/utils/getSelectionMessageId.d.ts.map +1 -1
  430. package/dist/utils/getSelectionMessageId.js +32 -7
  431. package/dist/utils/getSelectionMessageId.js.map +1 -1
  432. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  433. package/dist/utils/hooks/useMediaQuery.d.ts.map +1 -1
  434. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  435. package/dist/utils/hooks/useOnScrollToBottom.d.ts.map +1 -1
  436. package/dist/utils/hooks/useSizeHandle.d.ts +0 -1
  437. package/dist/utils/hooks/useSizeHandle.d.ts.map +1 -1
  438. package/dist/utils/smooth/SmoothContext.d.ts +71 -72
  439. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  440. package/dist/utils/smooth/useSmooth.d.ts +0 -1
  441. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  442. package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
  443. package/dist/utils/useToolArgsFieldStatus.d.ts.map +1 -1
  444. package/package.json +23 -23
  445. package/src/client/ExternalThread.ts +2 -1
  446. package/src/index.ts +3 -0
  447. package/src/legacy-runtime/cloud/auiV0.ts +72 -3
  448. package/src/mcp-apps/McpAppRenderer.test.tsx +141 -0
  449. package/src/mcp-apps/McpAppRenderer.tsx +48 -10
  450. package/src/mcp-apps/McpAppsRemoteHost.test.ts +126 -0
  451. package/src/mcp-apps/McpAppsRemoteHost.ts +40 -1
  452. package/src/mcp-apps/app-frame.tsx +3 -1
  453. package/src/mcp-apps/bridge.ts +1 -1
  454. package/src/mcp-apps/types.ts +16 -8
  455. package/src/model-context/makeAssistantVisible.test.tsx +146 -0
  456. package/src/model-context/makeAssistantVisible.tsx +18 -1
  457. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -8
  458. package/src/primitives/assistantModal/AssistantModalContent.tsx +5 -5
  459. package/src/primitives/assistantModal/AssistantModalTrigger.test.tsx +80 -0
  460. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -8
  461. package/src/primitives/assistantModal/popoverRenderPrimitives.ts +6 -0
  462. package/src/primitives/composer/ComposerCompactContext.tsx +13 -0
  463. package/src/primitives/composer/ComposerInput.tsx +35 -0
  464. package/src/primitives/composer/ComposerRoot.test.tsx +382 -0
  465. package/src/primitives/composer/ComposerRoot.tsx +86 -7
  466. package/src/primitives/messagePart/useMessagePartData.ts +3 -2
  467. package/src/primitives/messagePart/useMessagePartFile.ts +19 -7
  468. package/src/primitives/messagePart/useMessagePartImage.ts +18 -7
  469. package/src/primitives/messagePart/useMessagePartReasoning.ts +15 -6
  470. package/src/primitives/messagePart/useMessagePartSource.ts +20 -7
  471. package/src/primitives/messagePart/useMessagePartText.ts +15 -5
  472. package/src/primitives/thread/ThreadViewport.tsx +15 -0
  473. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +243 -0
  474. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +28 -7
  475. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +69 -0
  476. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +29 -0
  477. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +86 -1
  478. package/src/primitives/thread/useThreadViewportAutoScroll.ts +6 -1
  479. package/src/tests/BaseComposerRuntimeCore.test.ts +12 -3
  480. package/src/tests/LocalThreadRuntimeCore.test.ts +4 -1
  481. package/src/tests/auiV0Encode.test.ts +134 -1
  482. package/src/tests/external-thread-attachments.test.tsx +81 -0
  483. package/src/tests/messagePartSwitchRace.test.tsx +158 -0
  484. package/src/tests/messagePartTypeMismatch.test.tsx +146 -0
  485. package/src/utils/getSelectionMessageId.test.ts +175 -0
  486. package/src/utils/getSelectionMessageId.ts +57 -6
  487. package/dist/utils/json/is-json-equal.d.ts +0 -5
  488. package/dist/utils/json/is-json-equal.d.ts.map +0 -1
  489. package/dist/utils/json/is-json-equal.js +0 -26
  490. package/dist/utils/json/is-json-equal.js.map +0 -1
  491. package/dist/utils/json/is-json.d.ts +0 -10
  492. package/dist/utils/json/is-json.d.ts.map +0 -1
  493. package/dist/utils/json/is-json.js +0 -22
  494. package/dist/utils/json/is-json.js.map +0 -1
  495. package/src/utils/json/is-json-equal.ts +0 -48
  496. package/src/utils/json/is-json.ts +0 -58
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.js","names":["c","_c","useComposedRefs","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useCallback","useLayoutEffect","useMemo","useAuiEvent","useAuiState","useManagedRef","useThreadViewportAutoScroll","ThreadPrimitiveViewportProvider","useSizeHandle","useThreadViewport","useThreadViewportStore","useTopAnchorReserve","getActiveTopAnchorAnchorId","getActiveTopAnchorTargetId","ThreadPrimitiveViewport","Element","div","Props","autoScroll","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","useViewportSizeRef","register","_temp","getHeight","_temp2","useViewportElementRef","registerViewportElement","_temp3","useTopAnchorTurn","enabled","$","threadViewportStore","t0","s","thread","activeAnchorId","t1","s_0","activeTargetId","t2","bb0","t3","anchorId","targetId","activeTurn","t4","state","getState","current","topAnchorTurn","setTopAnchorTurn","t5","clearTopAnchorTurn","ThreadPrimitiveViewportScrollable","forwardedRef","children","rest","autoScrollRef","viewportSizeRef","viewportElementRef","topAnchorEnabled","ref","displayName","props","registerViewport","el","clientHeight"],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n useLayoutEffect,\n useMemo,\n} from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useThreadViewportAutoScroll } from \"./useThreadViewportAutoScroll\";\nimport { ThreadPrimitiveViewportProvider } from \"../../context/providers/ThreadViewportProvider\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { useTopAnchorReserve } from \"./topAnchor/useTopAnchorReserve\";\nimport {\n getActiveTopAnchorAnchorId,\n getActiveTopAnchorTargetId,\n} from \"./topAnchor/topAnchorTurn\";\n\nexport namespace ThreadPrimitiveViewport {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Controls scroll anchoring behavior for new messages.\n * - \"bottom\" (default): Messages anchor at the bottom, classic chat behavior.\n * - \"top\": New user messages anchor at the top of the viewport for a focused reading experience.\n */\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n\n /**\n * Clamps tall user messages so the assistant response stays in view.\n *\n * @default { tallerThan: \"10em\", visibleHeight: \"6em\" }\n */\n topAnchorMessageClamp?: {\n /**\n * Clamp messages taller than this. Supports `px`, `em`, and `rem`.\n *\n * @default \"10em\"\n */\n tallerThan?: string;\n /**\n * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.\n *\n * @default \"6em\"\n */\n visibleHeight?: string;\n };\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when thread history is first loaded.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nconst useViewportSizeRef = () => {\n const register = useThreadViewport((s) => s.registerViewport);\n const getHeight = useCallback((el: HTMLElement) => el.clientHeight, []);\n return useSizeHandle(register, getHeight);\n};\n\nconst useViewportElementRef = () => {\n const registerViewportElement = useThreadViewport(\n (s) => s.registerViewportElement,\n );\n\n return useManagedRef(registerViewportElement);\n};\n\nconst useTopAnchorTurn = (enabled: boolean) => {\n const threadViewportStore = useThreadViewportStore();\n const activeAnchorId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorAnchorId(s.thread);\n });\n const activeTargetId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorTargetId(s.thread);\n });\n const activeTurn = useMemo(() => {\n if (!activeAnchorId || !activeTargetId) return null;\n return { anchorId: activeAnchorId, targetId: activeTargetId };\n }, [activeAnchorId, activeTargetId]);\n\n useLayoutEffect(() => {\n if (!activeTurn) return;\n\n const state = threadViewportStore.getState();\n const current = state.topAnchorTurn;\n if (\n current?.anchorId === activeTurn.anchorId &&\n current.targetId === activeTurn.targetId\n ) {\n return;\n }\n\n state.setTopAnchorTurn(activeTurn);\n }, [activeTurn, threadViewportStore]);\n\n const clearTopAnchorTurn = useCallback(() => {\n threadViewportStore.getState().setTopAnchorTurn(null);\n }, [threadViewportStore]);\n\n useAuiEvent(\"thread.initialize\", clearTopAnchorTurn);\n useAuiEvent(\"threadListItem.switchedTo\", clearTopAnchorTurn);\n};\n\nconst ThreadPrimitiveViewportScrollable = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(\n (\n {\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n children,\n ...rest\n },\n forwardedRef,\n ) => {\n const autoScrollRef = useThreadViewportAutoScroll<HTMLDivElement>({\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n });\n const viewportSizeRef = useViewportSizeRef();\n const viewportElementRef = useViewportElementRef();\n const threadViewportStore = useThreadViewportStore();\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n const topAnchorEnabled = turnAnchor === \"top\";\n useTopAnchorTurn(topAnchorEnabled);\n useTopAnchorReserve(topAnchorEnabled);\n const ref = useComposedRefs(\n forwardedRef,\n autoScrollRef,\n viewportSizeRef,\n viewportElementRef,\n );\n\n return (\n <Primitive.div {...rest} ref={ref}>\n {children}\n </Primitive.div>\n );\n },\n);\n\nThreadPrimitiveViewportScrollable.displayName =\n \"ThreadPrimitive.ViewportScrollable\";\n\n/**\n * A scrollable viewport container for thread messages.\n *\n * This component provides a scrollable area for displaying thread messages with\n * automatic scrolling capabilities. It manages the viewport state and provides\n * context for child components to access viewport-related functionality.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport turnAnchor=\"top\">\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewport = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {\n return (\n <ThreadPrimitiveViewportProvider\n options={{ turnAnchor, topAnchorMessageClamp }}\n >\n <ThreadPrimitiveViewportScrollable {...props} ref={ref} />\n </ThreadPrimitiveViewportProvider>\n );\n});\n\nThreadPrimitiveViewport.displayName = \"ThreadPrimitive.Viewport\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadViewport.js","names":["c","_c","useComposedRefs","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useCallback","useLayoutEffect","useMemo","useAuiEvent","useAuiState","useManagedRef","useThreadViewportAutoScroll","ThreadPrimitiveViewportProvider","useSizeHandle","useThreadViewport","useThreadViewportStore","useTopAnchorReserve","getActiveTopAnchorAnchorId","getActiveTopAnchorTargetId","isTopAnchorTurnValid","ThreadPrimitiveViewport","Element","div","Props","autoScroll","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","useViewportSizeRef","register","_temp","getHeight","_temp2","useViewportElementRef","registerViewportElement","_temp3","useTopAnchorTurn","enabled","$","threadViewportStore","t0","s","thread","activeAnchorId","t1","s_0","activeTargetId","topAnchorTurn","_temp4","t2","bb0","t3","anchorId","targetId","activeTurn","s_2","messages","topAnchorTurnIsValid","t4","t5","getState","setTopAnchorTurn","t6","t7","state","current","t8","clearTopAnchorTurn","ThreadPrimitiveViewportScrollable","forwardedRef","children","rest","autoScrollRef","viewportSizeRef","viewportElementRef","topAnchorEnabled","ref","displayName","props","registerViewport","el","clientHeight","s_1"],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n useLayoutEffect,\n useMemo,\n} from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useThreadViewportAutoScroll } from \"./useThreadViewportAutoScroll\";\nimport { ThreadPrimitiveViewportProvider } from \"../../context/providers/ThreadViewportProvider\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { useTopAnchorReserve } from \"./topAnchor/useTopAnchorReserve\";\nimport {\n getActiveTopAnchorAnchorId,\n getActiveTopAnchorTargetId,\n isTopAnchorTurnValid,\n} from \"./topAnchor/topAnchorTurn\";\n\nexport namespace ThreadPrimitiveViewport {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Controls scroll anchoring behavior for new messages.\n * - \"bottom\" (default): Messages anchor at the bottom, classic chat behavior.\n * - \"top\": New user messages anchor at the top of the viewport for a focused reading experience.\n */\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n\n /**\n * Clamps tall user messages so the assistant response stays in view.\n *\n * @default { tallerThan: \"10em\", visibleHeight: \"6em\" }\n */\n topAnchorMessageClamp?: {\n /**\n * Clamp messages taller than this. Supports `px`, `em`, and `rem`.\n *\n * @default \"10em\"\n */\n tallerThan?: string;\n /**\n * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.\n *\n * @default \"6em\"\n */\n visibleHeight?: string;\n };\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when thread history is first loaded.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nconst useViewportSizeRef = () => {\n const register = useThreadViewport((s) => s.registerViewport);\n const getHeight = useCallback((el: HTMLElement) => el.clientHeight, []);\n return useSizeHandle(register, getHeight);\n};\n\nconst useViewportElementRef = () => {\n const registerViewportElement = useThreadViewport(\n (s) => s.registerViewportElement,\n );\n\n return useManagedRef(registerViewportElement);\n};\n\nconst useTopAnchorTurn = (enabled: boolean) => {\n const threadViewportStore = useThreadViewportStore();\n const activeAnchorId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorAnchorId(s.thread);\n });\n const activeTargetId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorTargetId(s.thread);\n });\n const topAnchorTurn = useThreadViewport((s) => s.topAnchorTurn);\n const activeTurn = useMemo(() => {\n if (!activeAnchorId || !activeTargetId) return null;\n return { anchorId: activeAnchorId, targetId: activeTargetId };\n }, [activeAnchorId, activeTargetId]);\n\n const topAnchorTurnIsValid = useAuiState(\n (s) =>\n enabled &&\n !!topAnchorTurn &&\n isTopAnchorTurnValid(topAnchorTurn, s.thread.messages),\n );\n\n useLayoutEffect(() => {\n if (!topAnchorTurn || topAnchorTurnIsValid) return;\n\n threadViewportStore.getState().setTopAnchorTurn(null);\n }, [threadViewportStore, topAnchorTurn, topAnchorTurnIsValid]);\n\n useLayoutEffect(() => {\n if (!activeTurn) return;\n\n const state = threadViewportStore.getState();\n const current = state.topAnchorTurn;\n if (\n current?.anchorId === activeTurn.anchorId &&\n current.targetId === activeTurn.targetId\n ) {\n return;\n }\n\n state.setTopAnchorTurn(activeTurn);\n }, [activeTurn, threadViewportStore]);\n\n const clearTopAnchorTurn = useCallback(() => {\n threadViewportStore.getState().setTopAnchorTurn(null);\n }, [threadViewportStore]);\n\n useAuiEvent(\"thread.initialize\", clearTopAnchorTurn);\n useAuiEvent(\"threadListItem.switchedTo\", clearTopAnchorTurn);\n};\n\nconst ThreadPrimitiveViewportScrollable = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(\n (\n {\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n children,\n ...rest\n },\n forwardedRef,\n ) => {\n const autoScrollRef = useThreadViewportAutoScroll<HTMLDivElement>({\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n });\n const viewportSizeRef = useViewportSizeRef();\n const viewportElementRef = useViewportElementRef();\n const threadViewportStore = useThreadViewportStore();\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n const topAnchorEnabled = turnAnchor === \"top\";\n useTopAnchorTurn(topAnchorEnabled);\n useTopAnchorReserve(topAnchorEnabled);\n const ref = useComposedRefs(\n forwardedRef,\n autoScrollRef,\n viewportSizeRef,\n viewportElementRef,\n );\n\n return (\n <Primitive.div {...rest} ref={ref}>\n {children}\n </Primitive.div>\n );\n },\n);\n\nThreadPrimitiveViewportScrollable.displayName =\n \"ThreadPrimitive.ViewportScrollable\";\n\n/**\n * A scrollable viewport container for thread messages.\n *\n * This component provides a scrollable area for displaying thread messages with\n * automatic scrolling capabilities. It manages the viewport state and provides\n * context for child components to access viewport-related functionality.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport turnAnchor=\"top\">\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewport = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {\n return (\n <ThreadPrimitiveViewportProvider\n options={{ turnAnchor, topAnchorMessageClamp }}\n >\n <ThreadPrimitiveViewportScrollable {...props} ref={ref} />\n </ThreadPrimitiveViewportProvider>\n );\n});\n\nThreadPrimitiveViewport.displayName = \"ThreadPrimitive.Viewport\";\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { Primitive } from "../../utils/Primitive.js";
2
2
  import { ComponentPropsWithoutRef, ComponentRef } from "react";
3
-
4
3
  //#region src/primitives/thread/ThreadViewportFooter.d.ts
5
4
  declare namespace ThreadPrimitiveViewportFooter {
6
5
  type Element = ComponentRef<typeof Primitive.div>;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewportFooter.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"mappings":";;;;kBAaiB,6BAAA;EAAA,KACH,OAAA,GAAU,YAAA,QAAoB,SAAA,CAAU,GAAA;EAAA,KACxC,KAAA,GAAQ,wBAAA,QAAgC,SAAA,CAAU,GAAA;AAAA;;;;;;;;;;;;;;;;;AAAG;AA2BnE;;;;;;;cAAa,6BAAA,kBAA6B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,cAAA,oBAAA,cAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"ThreadViewportFooter.d.ts","names":[],"sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"mappings":";;;kBAaiB;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ,gCAAgC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;cA2BnD,+CAA6B,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;oBAexC,cAAA,0CAAA,cAAA"}
@@ -18,17 +18,8 @@ type ComputeTopAnchorReserveOptions = ComputeTopAnchorTargetOptions & {
18
18
  * `viewport.scrollHeight` (which is volatile while the assistant message
19
19
  * streams in).
20
20
  */
21
- declare const computeTopAnchorTargetScrollTop: ({
22
- viewport,
23
- anchor,
24
- tallerThan,
25
- visibleHeight
26
- }: ComputeTopAnchorTargetOptions) => number;
27
- declare const computeTopAnchorReserve: ({
28
- viewport,
29
- reserve,
30
- ...targetOptions
31
- }: ComputeTopAnchorReserveOptions) => number;
21
+ declare const computeTopAnchorTargetScrollTop: ({ viewport, anchor, tallerThan, visibleHeight }: ComputeTopAnchorTargetOptions) => number;
22
+ declare const computeTopAnchorReserve: ({ viewport, reserve, ...targetOptions }: ComputeTopAnchorReserveOptions) => number;
32
23
  //#endregion
33
24
  export { ComputeTopAnchorReserveOptions, ComputeTopAnchorTargetOptions, computeTopAnchorReserve, computeTopAnchorTargetScrollTop };
34
25
  //# sourceMappingURL=computeTopAnchorSlack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"computeTopAnchorSlack.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"mappings":";KAEY,6BAAA;EACV,QAAA,EAAU,WAAA;EACV,MAAA,EAAQ,WAAW;EACnB,UAAA;EACA,aAAA;AAAA;AAAA,KAGU,8BAAA,GAAiC,6BAAA;EAC3C,OAAA,EAAS,WAAW;AAAA;;;;AAJP;AAGf;;;;;;cAiDa,+BAAA;EAAmC,QAAA;EAAA,MAAA;EAAA,UAAA;EAAA;AAAA,GAK7C,6BAAA;AAAA,cAoBU,uBAAA;EAA2B,QAAA;EAAA,OAAA;EAAA,GAAA;AAAA,GAIrC,8BAAA"}
1
+ {"version":3,"file":"computeTopAnchorSlack.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"mappings":";KAEY;EACV,UAAU;EACV,QAAQ;EACR;EACA;;KAGU,iCAAiC;EAC3C,SAAS;;;;;;;;;;;;cAgDE,oCAAmC,UAAA,QAAA,YAAA,iBAK7C;cAoBU,4BAA2B,UAAA,YAAA,iBAIrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createReserveObservers.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"mappings":";cAEa,sBAAA,GAA0B,QAAA;qBAkBvB,WAAA,EAAW,MAAA,EACb,WAAA,EAAW,MAAA,EACX,WAAA"}
1
+ {"version":3,"file":"createReserveObservers.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"mappings":";cAEa,yBAA0B;EAkBvB,SAAA,UAAA,aAAW,QACb,aAAW,QACX"}
@@ -16,6 +16,10 @@ type TopAnchorStore = {
16
16
  tallerThan: number;
17
17
  visibleHeight: number;
18
18
  } | null;
19
+ topAnchorTurn: {
20
+ readonly anchorId: string;
21
+ readonly targetId: string;
22
+ } | null;
19
23
  };
20
24
  subscribe(fn: () => void): () => void;
21
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mountTopAnchorReserve.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"mappings":";;AAmBA;;;;KAAY,cAAA;EACV,QAAA;IACE,UAAA;IACA,OAAA;MACE,QAAA,EAAU,WAAA;MACV,MAAA,EAAQ,WAAA;MACR,MAAA,EAAQ,WAAA;IAAA;IAEV,YAAA;MACE,UAAA;MACA,aAAA;IAAA;EAAA;EAGJ,SAAA,CAAU,EAAA;AAAA;AAAA,cAuBC,qBAAA,GAAyB,KAAqB,EAAd,cAAc"}
1
+ {"version":3,"file":"mountTopAnchorReserve.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"mappings":";;;;;;KAmBY;EACV;IACE;IACA;MACE,UAAU;MACV,QAAQ;MACR,QAAQ;;IAEV;MACE;MACA;;IAEF;eACW;eACA;;;EAGb,UAAU;;cAuBC,wBAAyB,OAAO"}
@@ -28,7 +28,20 @@ const mountTopAnchorReserve = (store) => {
28
28
  const state = store.getState();
29
29
  const { viewport, anchor, target } = state.element;
30
30
  const clamp = state.targetConfig;
31
- if (state.turnAnchor !== "top" || !viewport || !anchor || !target || !clamp) {
31
+ if (state.turnAnchor !== "top" || !viewport) {
32
+ observers.disconnect();
33
+ if (reserve) {
34
+ setReserveHeight(reserve, 0);
35
+ reserve.remove();
36
+ }
37
+ return;
38
+ }
39
+ if (!anchor && !target && !clamp && state.topAnchorTurn) {
40
+ observers.disconnect();
41
+ if (reserve?.parentElement && reserve.parentElement.lastElementChild !== reserve) reserve.parentElement.append(reserve);
42
+ return;
43
+ }
44
+ if (!anchor || !target || !clamp) {
32
45
  observers.disconnect();
33
46
  if (reserve) {
34
47
  setReserveHeight(reserve, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"mountTopAnchorReserve.js","names":["computeTopAnchorReserve","computeTopAnchorTargetScrollTop","createReserveObservers","createReserveElement","getAnchorId","setReserveHeight","snapScrollTop","TopAnchorStore","getState","turnAnchor","element","viewport","HTMLElement","anchor","target","targetConfig","tallerThan","visibleHeight","subscribe","fn","createFrameScheduler","frame","schedule","requestAnimationFrame","cancel","cancelAnimationFrame","mountTopAnchorReserve","store","reserve","lastScrolledAnchorId","apply","state","clamp","observers","disconnect","remove","parentElement","previousElementSibling","after","reserveChanged","scheduler","anchorId","undefined","targetScrollTop","Math","abs","scrollTop","scrollTo","top","behavior","unsubscribe"],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"sourcesContent":["\"use client\";\n\nimport {\n computeTopAnchorReserve,\n computeTopAnchorTargetScrollTop,\n} from \"./computeTopAnchorSlack\";\nimport { createReserveObservers } from \"./createReserveObservers\";\nimport {\n createReserveElement,\n getAnchorId,\n setReserveHeight,\n snapScrollTop,\n} from \"./topAnchorUtils\";\n\n/**\n * Minimal slice of `ThreadViewportStore` that the top-anchor reserve needs.\n * Decoupling from the full store keeps `mountTopAnchorReserve` testable in\n * isolation and re-usable from any consumer that can adapt to this shape.\n */\nexport type TopAnchorStore = {\n getState(): {\n turnAnchor: \"top\" | \"bottom\";\n element: {\n viewport: HTMLElement | null;\n anchor: HTMLElement | null;\n target: HTMLElement | null;\n };\n targetConfig: {\n tallerThan: number;\n visibleHeight: number;\n } | null;\n };\n subscribe(fn: () => void): () => void;\n};\n\nconst createFrameScheduler = (fn: () => void) => {\n let frame: number | null = null;\n\n return {\n schedule: () => {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n fn();\n });\n },\n cancel: () => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n },\n };\n};\n\nexport const mountTopAnchorReserve = (store: TopAnchorStore) => {\n let reserve: HTMLElement | null = null;\n let lastScrolledAnchorId: string | undefined;\n\n function apply() {\n const state = store.getState();\n const { viewport, anchor, target } = state.element;\n const clamp = state.targetConfig;\n\n if (\n state.turnAnchor !== \"top\" ||\n !viewport ||\n !anchor ||\n !target ||\n !clamp\n ) {\n observers.disconnect();\n if (reserve) {\n setReserveHeight(reserve, 0);\n reserve.remove();\n }\n return;\n }\n\n reserve ??= createReserveElement();\n\n if (\n reserve.parentElement !== target.parentElement ||\n reserve.previousElementSibling !== target\n ) {\n target.after(reserve);\n }\n\n observers.target(viewport, anchor, target);\n\n const reserveChanged = setReserveHeight(\n reserve,\n computeTopAnchorReserve({ viewport, anchor, reserve, ...clamp }),\n );\n\n if (reserveChanged) {\n scheduler.schedule();\n return;\n }\n\n const anchorId = getAnchorId(anchor);\n if (anchorId !== undefined && lastScrolledAnchorId === anchorId) return;\n\n const targetScrollTop = snapScrollTop(\n computeTopAnchorTargetScrollTop({ viewport, anchor, ...clamp }),\n );\n\n if (Math.abs(viewport.scrollTop - targetScrollTop) > 1) {\n viewport.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n }\n\n if (anchorId !== undefined) lastScrolledAnchorId = anchorId;\n }\n\n const scheduler = createFrameScheduler(apply);\n const observers = createReserveObservers(scheduler.schedule);\n\n scheduler.schedule();\n const unsubscribe = store.subscribe(scheduler.schedule);\n\n return () => {\n scheduler.cancel();\n unsubscribe();\n observers.disconnect();\n reserve?.remove();\n };\n};\n"],"mappings":";;;;;AAmCA,MAAMoB,wBAAwBD,OAAmB;CAC/C,IAAIE,QAAuB;CAE3B,OAAO;EACLC,gBAAgB;GACd,IAAID,UAAU,MAAM;GACpBA,QAAQE,4BAA4B;IAClCF,QAAQ;IACRF,GAAG;GACL,CAAC;EACH;EACAK,cAAc;GACZ,IAAIH,UAAU,MAAM;IAClBI,qBAAqBJ,KAAK;IAC1BA,QAAQ;GACV;EACF;CACF;AACF;AAEA,MAAaK,yBAAyBC,UAA0B;CAC9D,IAAIC,UAA8B;CAClC,IAAIC;CAEJ,SAASC,QAAQ;EACf,MAAMC,QAAQJ,MAAMnB,SAAS;EAC7B,MAAM,EAAEG,UAAUE,QAAQC,WAAWiB,MAAMrB;EAC3C,MAAMsB,QAAQD,MAAMhB;EAEpB,IACEgB,MAAMtB,eAAe,SACrB,CAACE,YACD,CAACE,UACD,CAACC,UACD,CAACkB,OACD;GACAC,UAAUC,WAAW;GACrB,IAAIN,SAAS;IACXvB,iBAAiBuB,SAAS,CAAC;IAC3BA,QAAQO,OAAO;GACjB;GACA;EACF;EAEAP,YAAYzB,qBAAqB;EAEjC,IACEyB,QAAQQ,kBAAkBtB,OAAOsB,iBACjCR,QAAQS,2BAA2BvB,QAEnCA,OAAOwB,MAAMV,OAAO;EAGtBK,UAAUnB,OAAOH,UAAUE,QAAQC,MAAM;EAOzC,IALuBT,iBACrBuB,SACA5B,wBAAwB;GAAEW;GAAUE;GAAQe;GAAS,GAAGI;EAAM,CAAC,CAG7DO,GAAgB;GAClBC,UAAUlB,SAAS;GACnB;EACF;EAEA,MAAMmB,WAAWrC,YAAYS,MAAM;EACnC,IAAI4B,aAAaC,KAAAA,KAAab,yBAAyBY,UAAU;EAEjE,MAAME,kBAAkBrC,cACtBL,gCAAgC;GAAEU;GAAUE;GAAQ,GAAGmB;EAAM,CAAC,CAChE;EAEA,IAAIY,KAAKC,IAAIlC,SAASmC,YAAYH,eAAe,IAAI,GACnDhC,SAASoC,SAAS;GAAEC,KAAKL;GAAiBM,UAAU;EAAS,CAAC;EAGhE,IAAIR,aAAaC,KAAAA,GAAWb,uBAAuBY;CACrD;CAEA,MAAMD,YAAYpB,qBAAqBU,KAAK;CAC5C,MAAMG,YAAY/B,uBAAuBsC,UAAUlB,QAAQ;CAE3DkB,UAAUlB,SAAS;CACnB,MAAM4B,cAAcvB,MAAMT,UAAUsB,UAAUlB,QAAQ;CAEtD,aAAa;EACXkB,UAAUhB,OAAO;EACjB0B,YAAY;EACZjB,UAAUC,WAAW;EACrBN,SAASO,OAAO;CAClB;AACF"}
1
+ {"version":3,"file":"mountTopAnchorReserve.js","names":["computeTopAnchorReserve","computeTopAnchorTargetScrollTop","createReserveObservers","createReserveElement","getAnchorId","setReserveHeight","snapScrollTop","TopAnchorStore","getState","turnAnchor","element","viewport","HTMLElement","anchor","target","targetConfig","tallerThan","visibleHeight","topAnchorTurn","anchorId","targetId","subscribe","fn","createFrameScheduler","frame","schedule","requestAnimationFrame","cancel","cancelAnimationFrame","mountTopAnchorReserve","store","reserve","lastScrolledAnchorId","apply","state","clamp","observers","disconnect","remove","parentElement","lastElementChild","append","previousElementSibling","after","reserveChanged","scheduler","undefined","targetScrollTop","Math","abs","scrollTop","scrollTo","top","behavior","unsubscribe"],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"sourcesContent":["\"use client\";\n\nimport {\n computeTopAnchorReserve,\n computeTopAnchorTargetScrollTop,\n} from \"./computeTopAnchorSlack\";\nimport { createReserveObservers } from \"./createReserveObservers\";\nimport {\n createReserveElement,\n getAnchorId,\n setReserveHeight,\n snapScrollTop,\n} from \"./topAnchorUtils\";\n\n/**\n * Minimal slice of `ThreadViewportStore` that the top-anchor reserve needs.\n * Decoupling from the full store keeps `mountTopAnchorReserve` testable in\n * isolation and re-usable from any consumer that can adapt to this shape.\n */\nexport type TopAnchorStore = {\n getState(): {\n turnAnchor: \"top\" | \"bottom\";\n element: {\n viewport: HTMLElement | null;\n anchor: HTMLElement | null;\n target: HTMLElement | null;\n };\n targetConfig: {\n tallerThan: number;\n visibleHeight: number;\n } | null;\n topAnchorTurn: {\n readonly anchorId: string;\n readonly targetId: string;\n } | null;\n };\n subscribe(fn: () => void): () => void;\n};\n\nconst createFrameScheduler = (fn: () => void) => {\n let frame: number | null = null;\n\n return {\n schedule: () => {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n fn();\n });\n },\n cancel: () => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n },\n };\n};\n\nexport const mountTopAnchorReserve = (store: TopAnchorStore) => {\n let reserve: HTMLElement | null = null;\n let lastScrolledAnchorId: string | undefined;\n\n function apply() {\n const state = store.getState();\n const { viewport, anchor, target } = state.element;\n const clamp = state.targetConfig;\n\n if (state.turnAnchor !== \"top\" || !viewport) {\n observers.disconnect();\n if (reserve) {\n setReserveHeight(reserve, 0);\n reserve.remove();\n }\n return;\n }\n\n if (!anchor && !target && !clamp && state.topAnchorTurn) {\n // ThreadViewport clears this state once the stored pair stops being the\n // trailing turn (followed at most by pending user messages), so reaching\n // here means the anchor gap is transient and the next run is imminent.\n observers.disconnect();\n if (\n reserve?.parentElement &&\n reserve.parentElement.lastElementChild !== reserve\n ) {\n reserve.parentElement.append(reserve);\n }\n return;\n }\n\n if (!anchor || !target || !clamp) {\n observers.disconnect();\n if (reserve) {\n setReserveHeight(reserve, 0);\n reserve.remove();\n }\n return;\n }\n\n reserve ??= createReserveElement();\n\n if (\n reserve.parentElement !== target.parentElement ||\n reserve.previousElementSibling !== target\n ) {\n target.after(reserve);\n }\n\n observers.target(viewport, anchor, target);\n\n const reserveChanged = setReserveHeight(\n reserve,\n computeTopAnchorReserve({ viewport, anchor, reserve, ...clamp }),\n );\n\n if (reserveChanged) {\n scheduler.schedule();\n return;\n }\n\n const anchorId = getAnchorId(anchor);\n if (anchorId !== undefined && lastScrolledAnchorId === anchorId) return;\n\n const targetScrollTop = snapScrollTop(\n computeTopAnchorTargetScrollTop({ viewport, anchor, ...clamp }),\n );\n\n if (Math.abs(viewport.scrollTop - targetScrollTop) > 1) {\n viewport.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n }\n\n if (anchorId !== undefined) lastScrolledAnchorId = anchorId;\n }\n\n const scheduler = createFrameScheduler(apply);\n const observers = createReserveObservers(scheduler.schedule);\n\n scheduler.schedule();\n const unsubscribe = store.subscribe(scheduler.schedule);\n\n return () => {\n scheduler.cancel();\n unsubscribe();\n observers.disconnect();\n reserve?.remove();\n };\n};\n"],"mappings":";;;;;AAuCA,MAAMuB,wBAAwBD,OAAmB;CAC/C,IAAIE,QAAuB;CAE3B,OAAO;EACLC,gBAAgB;GACd,IAAID,UAAU,MAAM;GACpBA,QAAQE,4BAA4B;IAClCF,QAAQ;IACRF,GAAG;GACL,CAAC;EACH;EACAK,cAAc;GACZ,IAAIH,UAAU,MAAM;IAClBI,qBAAqBJ,KAAK;IAC1BA,QAAQ;GACV;EACF;CACF;AACF;AAEA,MAAaK,yBAAyBC,UAA0B;CAC9D,IAAIC,UAA8B;CAClC,IAAIC;CAEJ,SAASC,QAAQ;EACf,MAAMC,QAAQJ,MAAMtB,SAAS;EAC7B,MAAM,EAAEG,UAAUE,QAAQC,WAAWoB,MAAMxB;EAC3C,MAAMyB,QAAQD,MAAMnB;EAEpB,IAAImB,MAAMzB,eAAe,SAAS,CAACE,UAAU;GAC3CyB,UAAUC,WAAW;GACrB,IAAIN,SAAS;IACX1B,iBAAiB0B,SAAS,CAAC;IAC3BA,QAAQO,OAAO;GACjB;GACA;EACF;EAEA,IAAI,CAACzB,UAAU,CAACC,UAAU,CAACqB,SAASD,MAAMhB,eAAe;GAIvDkB,UAAUC,WAAW;GACrB,IACEN,SAASQ,iBACTR,QAAQQ,cAAcC,qBAAqBT,SAE3CA,QAAQQ,cAAcE,OAAOV,OAAO;GAEtC;EACF;EAEA,IAAI,CAAClB,UAAU,CAACC,UAAU,CAACqB,OAAO;GAChCC,UAAUC,WAAW;GACrB,IAAIN,SAAS;IACX1B,iBAAiB0B,SAAS,CAAC;IAC3BA,QAAQO,OAAO;GACjB;GACA;EACF;EAEAP,YAAY5B,qBAAqB;EAEjC,IACE4B,QAAQQ,kBAAkBzB,OAAOyB,iBACjCR,QAAQW,2BAA2B5B,QAEnCA,OAAO6B,MAAMZ,OAAO;EAGtBK,UAAUtB,OAAOH,UAAUE,QAAQC,MAAM;EAOzC,IALuBT,iBACrB0B,SACA/B,wBAAwB;GAAEW;GAAUE;GAAQkB;GAAS,GAAGI;EAAM,CAAC,CAG7DS,GAAgB;GAClBC,UAAUpB,SAAS;GACnB;EACF;EAEA,MAAMN,WAAWf,YAAYS,MAAM;EACnC,IAAIM,aAAa2B,KAAAA,KAAad,yBAAyBb,UAAU;EAEjE,MAAM4B,kBAAkBzC,cACtBL,gCAAgC;GAAEU;GAAUE;GAAQ,GAAGsB;EAAM,CAAC,CAChE;EAEA,IAAIa,KAAKC,IAAItC,SAASuC,YAAYH,eAAe,IAAI,GACnDpC,SAASwC,SAAS;GAAEC,KAAKL;GAAiBM,UAAU;EAAS,CAAC;EAGhE,IAAIlC,aAAa2B,KAAAA,GAAWd,uBAAuBb;CACrD;CAEA,MAAM0B,YAAYtB,qBAAqBU,KAAK;CAC5C,MAAMG,YAAYlC,uBAAuB2C,UAAUpB,QAAQ;CAE3DoB,UAAUpB,SAAS;CACnB,MAAM6B,cAAcxB,MAAMT,UAAUwB,UAAUpB,QAAQ;CAEtD,aAAa;EACXoB,UAAUlB,OAAO;EACjB2B,YAAY;EACZlB,UAAUC,WAAW;EACrBN,SAASO,OAAO;CAClB;AACF"}
@@ -3,10 +3,19 @@ type TopAnchorTurnMessage = {
3
3
  readonly id: string;
4
4
  readonly role: string;
5
5
  };
6
- declare const getActiveTopAnchorTurn: ({
7
- isRunning,
8
- messages
9
- }: {
6
+ type TopAnchorTurn = {
7
+ readonly anchorId: string;
8
+ readonly targetId: string;
9
+ };
10
+ /**
11
+ * A stored turn stays valid only while it is still the trailing turn: the
12
+ * anchor immediately precedes the target, and anything after the target is a
13
+ * pending user message awaiting the next run. An assistant message after the
14
+ * target means the turn was superseded (e.g. an external store synced in a
15
+ * turn completed elsewhere), so the reserve must be torn down, not preserved.
16
+ */
17
+ declare const isTopAnchorTurnValid: (turn: TopAnchorTurn | null, messages: readonly TopAnchorTurnMessage[]) => boolean;
18
+ declare const getActiveTopAnchorTurn: ({ isRunning, messages }: {
10
19
  readonly isRunning: boolean;
11
20
  readonly messages: readonly TopAnchorTurnMessage[];
12
21
  }) => {
@@ -16,5 +25,5 @@ declare const getActiveTopAnchorTurn: ({
16
25
  declare const getActiveTopAnchorAnchorId: (options: Parameters<typeof getActiveTopAnchorTurn>[0]) => string | undefined;
17
26
  declare const getActiveTopAnchorTargetId: (options: Parameters<typeof getActiveTopAnchorTurn>[0]) => string | undefined;
18
27
  //#endregion
19
- export { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, getActiveTopAnchorTurn };
28
+ export { TopAnchorTurn, getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, getActiveTopAnchorTurn, isTopAnchorTurnValid };
20
29
  //# sourceMappingURL=topAnchorTurn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"topAnchorTurn.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"mappings":";KAEK,oBAAA;EAAA,SACM,EAAA;EAAA,SACA,IAAI;AAAA;AAAA,cAGF,sBAAA;EAA0B,SAAA;EAAA;AAAA;EAAA,SAI5B,SAAA;EAAA,SACA,QAAA,WAAmB,oBAAA;AAAA;;;;cAWjB,0BAAA,GACX,OAAA,EAAS,UAAU,QAAQ,sBAAA;AAAA,cAGhB,0BAAA,GACX,OAAA,EAAS,UAAU,QAAQ,sBAAA"}
1
+ {"version":3,"file":"topAnchorTurn.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"mappings":";KAEK;WACM;WACA;;KAGC;WACD;WACA;;;;;;;;;cAUE,uBACX,MAAM,sBACN,mBAAmB;cAeR,2BAA0B,WAAA;WAI5B;WACA,mBAAmB;;;;;cAWjB,6BACX,SAAS,kBAAkB;cAGhB,6BACX,SAAS,kBAAkB"}
@@ -1,5 +1,18 @@
1
1
  "use client";
2
2
  //#region src/primitives/thread/topAnchor/topAnchorTurn.ts
3
+ /**
4
+ * A stored turn stays valid only while it is still the trailing turn: the
5
+ * anchor immediately precedes the target, and anything after the target is a
6
+ * pending user message awaiting the next run. An assistant message after the
7
+ * target means the turn was superseded (e.g. an external store synced in a
8
+ * turn completed elsewhere), so the reserve must be torn down, not preserved.
9
+ */
10
+ const isTopAnchorTurnValid = (turn, messages) => {
11
+ if (!turn) return false;
12
+ const targetIndex = messages.findIndex((message) => message.id === turn.targetId);
13
+ if (targetIndex < 1) return false;
14
+ return messages[targetIndex - 1]?.id === turn.anchorId && messages.slice(targetIndex + 1).every((message) => message.role === "user");
15
+ };
3
16
  const getActiveTopAnchorTurn = ({ isRunning, messages }) => {
4
17
  if (!isRunning) return null;
5
18
  const target = messages.at(-1);
@@ -13,6 +26,6 @@ const getActiveTopAnchorTurn = ({ isRunning, messages }) => {
13
26
  const getActiveTopAnchorAnchorId = (options) => getActiveTopAnchorTurn(options)?.anchorId;
14
27
  const getActiveTopAnchorTargetId = (options) => getActiveTopAnchorTurn(options)?.targetId;
15
28
  //#endregion
16
- export { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, getActiveTopAnchorTurn };
29
+ export { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, getActiveTopAnchorTurn, isTopAnchorTurnValid };
17
30
 
18
31
  //# sourceMappingURL=topAnchorTurn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"topAnchorTurn.js","names":["TopAnchorTurnMessage","id","role","getActiveTopAnchorTurn","isRunning","messages","target","at","anchor","anchorId","targetId","getActiveTopAnchorAnchorId","options","Parameters","getActiveTopAnchorTargetId"],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"sourcesContent":["\"use client\";\n\ntype TopAnchorTurnMessage = {\n readonly id: string;\n readonly role: string;\n};\n\nexport const getActiveTopAnchorTurn = ({\n isRunning,\n messages,\n}: {\n readonly isRunning: boolean;\n readonly messages: readonly TopAnchorTurnMessage[];\n}) => {\n if (!isRunning) return null;\n\n const target = messages.at(-1);\n const anchor = messages.at(-2);\n if (anchor?.role !== \"user\" || target?.role !== \"assistant\") return null;\n\n return { anchorId: anchor.id, targetId: target.id };\n};\n\nexport const getActiveTopAnchorAnchorId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.anchorId;\n\nexport const getActiveTopAnchorTargetId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.targetId;\n"],"mappings":";;AAOA,MAAaG,0BAA0B,EACrCC,WACAC,eAII;CACJ,IAAI,CAACD,WAAW,OAAO;CAEvB,MAAME,SAASD,SAASE,GAAG,EAAE;CAC7B,MAAMC,SAASH,SAASE,GAAG,EAAE;CAC7B,IAAIC,QAAQN,SAAS,UAAUI,QAAQJ,SAAS,aAAa,OAAO;CAEpE,OAAO;EAAEO,UAAUD,OAAOP;EAAIS,UAAUJ,OAAOL;CAAG;AACpD;AAEA,MAAaU,8BACXC,YACGT,uBAAuBS,OAAO,CAAC,EAAEH;AAEtC,MAAaK,8BACXF,YACGT,uBAAuBS,OAAO,CAAC,EAAEF"}
1
+ {"version":3,"file":"topAnchorTurn.js","names":["TopAnchorTurnMessage","id","role","TopAnchorTurn","anchorId","targetId","isTopAnchorTurnValid","turn","messages","targetIndex","findIndex","message","slice","every","getActiveTopAnchorTurn","isRunning","target","at","anchor","getActiveTopAnchorAnchorId","options","Parameters","getActiveTopAnchorTargetId"],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"sourcesContent":["\"use client\";\n\ntype TopAnchorTurnMessage = {\n readonly id: string;\n readonly role: string;\n};\n\nexport type TopAnchorTurn = {\n readonly anchorId: string;\n readonly targetId: string;\n};\n\n/**\n * A stored turn stays valid only while it is still the trailing turn: the\n * anchor immediately precedes the target, and anything after the target is a\n * pending user message awaiting the next run. An assistant message after the\n * target means the turn was superseded (e.g. an external store synced in a\n * turn completed elsewhere), so the reserve must be torn down, not preserved.\n */\nexport const isTopAnchorTurnValid = (\n turn: TopAnchorTurn | null,\n messages: readonly TopAnchorTurnMessage[],\n) => {\n if (!turn) return false;\n\n const targetIndex = messages.findIndex(\n (message) => message.id === turn.targetId,\n );\n if (targetIndex < 1) return false;\n\n return (\n messages[targetIndex - 1]?.id === turn.anchorId &&\n messages.slice(targetIndex + 1).every((message) => message.role === \"user\")\n );\n};\n\nexport const getActiveTopAnchorTurn = ({\n isRunning,\n messages,\n}: {\n readonly isRunning: boolean;\n readonly messages: readonly TopAnchorTurnMessage[];\n}) => {\n if (!isRunning) return null;\n\n const target = messages.at(-1);\n const anchor = messages.at(-2);\n if (anchor?.role !== \"user\" || target?.role !== \"assistant\") return null;\n\n return { anchorId: anchor.id, targetId: target.id };\n};\n\nexport const getActiveTopAnchorAnchorId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.anchorId;\n\nexport const getActiveTopAnchorTargetId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.targetId;\n"],"mappings":";;;;;;;;;AAmBA,MAAaM,wBACXC,MACAC,aACG;CACH,IAAI,CAACD,MAAM,OAAO;CAElB,MAAME,cAAcD,SAASE,WAC1BC,YAAYA,QAAQV,OAAOM,KAAKF,QACnC;CACA,IAAII,cAAc,GAAG,OAAO;CAE5B,OACED,SAASC,cAAc,EAAE,EAAER,OAAOM,KAAKH,YACvCI,SAASI,MAAMH,cAAc,CAAC,CAAC,CAACI,OAAOF,YAAYA,QAAQT,SAAS,MAAM;AAE9E;AAEA,MAAaY,0BAA0B,EACrCC,WACAP,eAII;CACJ,IAAI,CAACO,WAAW,OAAO;CAEvB,MAAMC,SAASR,SAASS,GAAG,EAAE;CAC7B,MAAMC,SAASV,SAASS,GAAG,EAAE;CAC7B,IAAIC,QAAQhB,SAAS,UAAUc,QAAQd,SAAS,aAAa,OAAO;CAEpE,OAAO;EAAEE,UAAUc,OAAOjB;EAAII,UAAUW,OAAOf;CAAG;AACpD;AAEA,MAAakB,8BACXC,YACGN,uBAAuBM,OAAO,CAAC,EAAEhB;AAEtC,MAAakB,8BACXF,YACGN,uBAAuBM,OAAO,CAAC,EAAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"topAnchorUtils.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"mappings":";;AAWA;;;;;;;;cAAa,cAAA,GAAkB,KAAA,UAAe,OAAA,EAAS,WAAW;AAAA,cAoBrD,WAAA,GAAe,MAAmB,EAAX,WAAW;AAAA,cAElC,oBAAA,QAAoB,cAShC;AAAA,cAEY,gBAAA,GAAoB,OAAA,EAAS,WAAW,EAAE,MAAA;AAAA,cAU1C,aAAA,GAAiB,GAAW"}
1
+ {"version":3,"file":"topAnchorUtils.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"mappings":";;;;;;;;;;cAWa,iBAAkB,eAAe,SAAS;cAoB1C,cAAe,QAAQ;cAEvB,4BAAoB;cAWpB,mBAAoB,SAAS,aAAa;cAU1C,gBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTopAnchorReserve.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/useTopAnchorReserve.ts"],"mappings":";;AAWA;;;;cAAa,mBAAA,GAAuB,OAAgB"}
1
+ {"version":3,"file":"useTopAnchorReserve.d.ts","names":[],"sources":["../../../../src/primitives/thread/topAnchor/useTopAnchorReserve.ts"],"mappings":";;;;;;cAWa,sBAAuB"}
@@ -1,5 +1,4 @@
1
1
  import { RefCallback } from "react";
2
-
3
2
  //#region src/primitives/thread/useThreadViewportAutoScroll.d.ts
4
3
  declare namespace useThreadViewportAutoScroll {
5
4
  type Options = {
@@ -30,12 +29,7 @@ declare namespace useThreadViewportAutoScroll {
30
29
  scrollToBottomOnThreadSwitch?: boolean | undefined;
31
30
  };
32
31
  }
33
- declare const useThreadViewportAutoScroll: <TElement extends HTMLElement>({
34
- autoScroll,
35
- scrollToBottomOnRunStart,
36
- scrollToBottomOnInitialize,
37
- scrollToBottomOnThreadSwitch
38
- }: useThreadViewportAutoScroll.Options) => RefCallback<TElement>;
32
+ declare const useThreadViewportAutoScroll: <TElement extends HTMLElement>({ autoScroll, scrollToBottomOnRunStart, scrollToBottomOnInitialize, scrollToBottomOnThreadSwitch }: useThreadViewportAutoScroll.Options) => RefCallback<TElement>;
39
33
  //#endregion
40
34
  export { useThreadViewportAutoScroll };
41
35
  //# sourceMappingURL=useThreadViewportAutoScroll.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useThreadViewportAutoScroll.d.ts","names":[],"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"mappings":";;;kBAWiB,2BAAA;EAAA,KACH,OAAA;IADG;;;;;;IAQb,UAAA;IAcA;;;AAO4B;AAIhC;IAlBI,wBAAA;IA0MH;;;;;IAnMG,0BAAA;IAgBD;;;;;IATC,4BAAA;EAAA;AAAA;AAAA,cAIS,2BAAA,oBAAgD,WAAA;EAAa,UAAA;EAAA,wBAAA;EAAA,0BAAA;EAAA;AAAA,GAKvE,2BAAA,CAA4B,OAAA,KAAU,WAAA,CAAY,QAAA"}
1
+ {"version":3,"file":"useThreadViewportAutoScroll.d.ts","names":[],"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"mappings":";;kBAWiB;OACH;;;;;;;IAOV;;;;;;IAOA;;;;;;IAOA;;;;;;IAOA;;;cAIS,8BAA+B,iBAAiB,eAAa,YAAA,0BAAA,4BAAA,gCAKvE,4BAA4B,YAAU,YAAY"}
@@ -11,6 +11,7 @@ import { useComposedRefs } from "@radix-ui/react-compose-refs";
11
11
  const useThreadViewportAutoScroll = ({ autoScroll, scrollToBottomOnRunStart = true, scrollToBottomOnInitialize = true, scrollToBottomOnThreadSwitch = true }) => {
12
12
  const divRef = useRef(null);
13
13
  const hasMessages = useAuiState((s) => s.thread.messages.length > 0);
14
+ const isRunning = useAuiState((s_0) => s_0.thread.isRunning);
14
15
  const initializeScrollRequestedRef = useRef(false);
15
16
  const scheduledFrameRef = useRef(null);
16
17
  const threadViewportStore = useThreadViewportStore();
@@ -68,7 +69,7 @@ const useThreadViewportAutoScroll = ({ autoScroll, scrollToBottomOnRunStart = tr
68
69
  const scrollBehavior = scrollingToBottomBehaviorRef.current;
69
70
  if (scrollBehavior && hasActiveTopAnchor()) scrollingToBottomBehaviorRef.current = null;
70
71
  else if (scrollBehavior) scrollToBottom(scrollBehavior);
71
- else if (autoScroll && threadViewportStore.getState().isAtBottom) scrollToBottom("instant");
72
+ else if (autoScroll && !(isRunning && hasActiveTopAnchor()) && threadViewportStore.getState().isAtBottom) scrollToBottom("instant");
72
73
  handleScroll();
73
74
  });
74
75
  const scrollRef = useManagedRef((el) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useThreadViewportAutoScroll.js","names":["useComposedRefs","useCallback","useLayoutEffect","useRef","RefCallback","useAuiEvent","useAuiState","useOnResizeContent","useOnScrollToBottom","useManagedRef","writableStore","useThreadViewportStore","useThreadViewportAutoScroll","Options","autoScroll","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","HTMLElement","TElement","divRef","hasMessages","s","thread","messages","length","initializeScrollRequestedRef","scheduledFrameRef","threadViewportStore","undefined","getState","turnAnchor","lastScrollTop","lastScrollHeight","lastObservedScrollHeight","lastObservedClientHeight","scrollingToBottomBehaviorRef","ScrollBehavior","scrollToBottom","behavior","div","current","scrollTo","top","scrollHeight","scheduleScrollToBottom","cancelAnimationFrame","requestAnimationFrame","hasActiveTopAnchor","state","element","viewport","anchor","handleScroll","isAtBottom","newIsAtBottom","Math","abs","scrollTop","clientHeight","isInFlightDownwardScroll","viewportOverflows","shouldUpdate","setState","resizeRef","scrollBehavior","scrollRef","el","cancelPendingScrollToBottom","addEventListener","removeEventListener","autoScrollRef"],"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallback, useLayoutEffect, useRef, type RefCallback } from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { writableStore } from \"../../context/ReadonlyStore\";\nimport { useThreadViewportStore } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadViewportAutoScroll {\n export type Options = {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when messages first appear in the thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nexport const useThreadViewportAutoScroll = <TElement extends HTMLElement>({\n autoScroll,\n scrollToBottomOnRunStart = true,\n scrollToBottomOnInitialize = true,\n scrollToBottomOnThreadSwitch = true,\n}: useThreadViewportAutoScroll.Options): RefCallback<TElement> => {\n const divRef = useRef<TElement>(null);\n const hasMessages = useAuiState((s) => s.thread.messages.length > 0);\n const initializeScrollRequestedRef = useRef(false);\n const scheduledFrameRef = useRef<number | null>(null);\n\n const threadViewportStore = useThreadViewportStore();\n if (autoScroll === undefined) {\n autoScroll = threadViewportStore.getState().turnAnchor !== \"top\";\n }\n\n const lastScrollTop = useRef<number>(0);\n const lastScrollHeight = useRef<number>(0);\n const lastObservedScrollHeight = useRef<number>(0);\n const lastObservedClientHeight = useRef<number>(0);\n\n // Pending bottom-scroll intent. Planted by initialize/run-start/switch/button\n // triggers, cleared when handleScroll confirms we reached bottom, or when the\n // user actively scrolls up while content size is stable.\n const scrollingToBottomBehaviorRef = useRef<ScrollBehavior | null>(null);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior) => {\n const div = divRef.current;\n if (!div) return;\n\n scrollingToBottomBehaviorRef.current = behavior;\n div.scrollTo({ top: div.scrollHeight, behavior });\n }, []);\n\n const scheduleScrollToBottom = useCallback(\n (behavior: ScrollBehavior) => {\n scrollingToBottomBehaviorRef.current = behavior;\n if (scheduledFrameRef.current !== null) {\n cancelAnimationFrame(scheduledFrameRef.current);\n }\n scheduledFrameRef.current = requestAnimationFrame(() => {\n scheduledFrameRef.current = null;\n scrollToBottom(behavior);\n });\n },\n [scrollToBottom],\n );\n\n useLayoutEffect(\n () => () => {\n if (scheduledFrameRef.current !== null) {\n cancelAnimationFrame(scheduledFrameRef.current);\n }\n },\n [],\n );\n\n const hasActiveTopAnchor = useCallback(() => {\n const state = threadViewportStore.getState();\n return (\n state.turnAnchor === \"top\" &&\n state.element.viewport === divRef.current &&\n state.element.anchor !== null\n );\n }, [threadViewportStore]);\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = threadViewportStore.getState().isAtBottom;\n const newIsAtBottom =\n Math.abs(div.scrollHeight - div.scrollTop - div.clientHeight) <= 1 ||\n div.scrollHeight <= div.clientHeight;\n\n const isInFlightDownwardScroll =\n !newIsAtBottom && lastScrollTop.current < div.scrollTop;\n if (isInFlightDownwardScroll) {\n // no-op: a smooth scroll-to-bottom fires many midpoint scroll events\n // before landing, don't flicker isAtBottom or clear intent mid-animation\n } else {\n if (newIsAtBottom) {\n // newIsAtBottom is ambiguous when the viewport doesn't overflow —\n // keep intent alive until content can actually scroll\n const viewportOverflows = div.scrollHeight > div.clientHeight + 1;\n if (viewportOverflows) {\n scrollingToBottomBehaviorRef.current = null;\n }\n } else if (\n lastScrollTop.current > div.scrollTop &&\n lastScrollHeight.current === div.scrollHeight\n ) {\n // scrollHeight equality rules out content-driven shifts being misread as user scroll-up\n scrollingToBottomBehaviorRef.current = null;\n }\n\n const shouldUpdate =\n newIsAtBottom || scrollingToBottomBehaviorRef.current === null;\n\n if (shouldUpdate && newIsAtBottom !== isAtBottom) {\n writableStore(threadViewportStore).setState({\n isAtBottom: newIsAtBottom,\n });\n }\n }\n\n lastScrollTop.current = div.scrollTop;\n lastScrollHeight.current = div.scrollHeight;\n };\n\n const resizeRef = useOnResizeContent(() => {\n const div = divRef.current;\n if (!div) return;\n\n const { scrollHeight, clientHeight } = div;\n if (\n scrollHeight === lastObservedScrollHeight.current &&\n clientHeight === lastObservedClientHeight.current\n ) {\n return;\n }\n lastObservedScrollHeight.current = scrollHeight;\n lastObservedClientHeight.current = clientHeight;\n\n const scrollBehavior = scrollingToBottomBehaviorRef.current;\n if (scrollBehavior && hasActiveTopAnchor()) {\n // Let the top-anchor reserve own scrolling while a run starts to avoid a bottom-scroll race.\n scrollingToBottomBehaviorRef.current = null;\n } else if (scrollBehavior) {\n scrollToBottom(scrollBehavior);\n } else if (autoScroll && threadViewportStore.getState().isAtBottom) {\n scrollToBottom(\"instant\");\n }\n\n handleScroll();\n });\n\n const scrollRef = useManagedRef<HTMLElement>((el) => {\n // A pointer gesture invalidates pending bottom-scroll intent; otherwise an\n // intent kept alive by a non-overflowing thread (see handleScroll) hijacks\n // the next content growth, e.g. expanding a collapsible tool call.\n const cancelPendingScrollToBottom = () => {\n scrollingToBottomBehaviorRef.current = null;\n };\n el.addEventListener(\"scroll\", handleScroll);\n el.addEventListener(\"pointerdown\", cancelPendingScrollToBottom);\n return () => {\n el.removeEventListener(\"scroll\", handleScroll);\n el.removeEventListener(\"pointerdown\", cancelPendingScrollToBottom);\n };\n });\n\n useLayoutEffect(() => {\n if (!scrollToBottomOnInitialize) return;\n if (!hasMessages) {\n initializeScrollRequestedRef.current = false;\n return;\n }\n if (initializeScrollRequestedRef.current) return;\n\n initializeScrollRequestedRef.current = true;\n // defer to an in-flight run (e.g. first message on a new thread) that\n // already planted intent — otherwise we'd downgrade its \"auto\" to \"instant\"\n if (scrollingToBottomBehaviorRef.current !== null) return;\n scheduleScrollToBottom(\"instant\");\n }, [hasMessages, scheduleScrollToBottom, scrollToBottomOnInitialize]);\n\n useOnScrollToBottom(({ behavior }) => {\n scrollToBottom(behavior);\n });\n\n useAuiEvent(\"thread.runStart\", () => {\n if (!scrollToBottomOnRunStart) return;\n if (threadViewportStore.getState().turnAnchor === \"top\") return;\n scheduleScrollToBottom(\"auto\");\n });\n\n useAuiEvent(\"threadListItem.switchedTo\", () => {\n if (!scrollToBottomOnThreadSwitch) return;\n scheduleScrollToBottom(\"instant\");\n });\n\n const autoScrollRef = useComposedRefs<TElement>(resizeRef, scrollRef, divRef);\n return autoScrollRef as RefCallback<TElement>;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useThreadViewportAutoScroll.js","names":["useComposedRefs","useCallback","useLayoutEffect","useRef","RefCallback","useAuiEvent","useAuiState","useOnResizeContent","useOnScrollToBottom","useManagedRef","writableStore","useThreadViewportStore","useThreadViewportAutoScroll","Options","autoScroll","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","HTMLElement","TElement","divRef","hasMessages","s","thread","messages","length","isRunning","initializeScrollRequestedRef","scheduledFrameRef","threadViewportStore","undefined","getState","turnAnchor","lastScrollTop","lastScrollHeight","lastObservedScrollHeight","lastObservedClientHeight","scrollingToBottomBehaviorRef","ScrollBehavior","scrollToBottom","behavior","div","current","scrollTo","top","scrollHeight","scheduleScrollToBottom","cancelAnimationFrame","requestAnimationFrame","hasActiveTopAnchor","state","element","viewport","anchor","handleScroll","isAtBottom","newIsAtBottom","Math","abs","scrollTop","clientHeight","isInFlightDownwardScroll","viewportOverflows","shouldUpdate","setState","resizeRef","scrollBehavior","scrollRef","el","cancelPendingScrollToBottom","addEventListener","removeEventListener","autoScrollRef"],"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallback, useLayoutEffect, useRef, type RefCallback } from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { writableStore } from \"../../context/ReadonlyStore\";\nimport { useThreadViewportStore } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadViewportAutoScroll {\n export type Options = {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when messages first appear in the thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nexport const useThreadViewportAutoScroll = <TElement extends HTMLElement>({\n autoScroll,\n scrollToBottomOnRunStart = true,\n scrollToBottomOnInitialize = true,\n scrollToBottomOnThreadSwitch = true,\n}: useThreadViewportAutoScroll.Options): RefCallback<TElement> => {\n const divRef = useRef<TElement>(null);\n const hasMessages = useAuiState((s) => s.thread.messages.length > 0);\n const isRunning = useAuiState((s) => s.thread.isRunning);\n const initializeScrollRequestedRef = useRef(false);\n const scheduledFrameRef = useRef<number | null>(null);\n\n const threadViewportStore = useThreadViewportStore();\n if (autoScroll === undefined) {\n autoScroll = threadViewportStore.getState().turnAnchor !== \"top\";\n }\n\n const lastScrollTop = useRef<number>(0);\n const lastScrollHeight = useRef<number>(0);\n const lastObservedScrollHeight = useRef<number>(0);\n const lastObservedClientHeight = useRef<number>(0);\n\n // Pending bottom-scroll intent. Planted by initialize/run-start/switch/button\n // triggers, cleared when handleScroll confirms we reached bottom, or when the\n // user actively scrolls up while content size is stable.\n const scrollingToBottomBehaviorRef = useRef<ScrollBehavior | null>(null);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior) => {\n const div = divRef.current;\n if (!div) return;\n\n scrollingToBottomBehaviorRef.current = behavior;\n div.scrollTo({ top: div.scrollHeight, behavior });\n }, []);\n\n const scheduleScrollToBottom = useCallback(\n (behavior: ScrollBehavior) => {\n scrollingToBottomBehaviorRef.current = behavior;\n if (scheduledFrameRef.current !== null) {\n cancelAnimationFrame(scheduledFrameRef.current);\n }\n scheduledFrameRef.current = requestAnimationFrame(() => {\n scheduledFrameRef.current = null;\n scrollToBottom(behavior);\n });\n },\n [scrollToBottom],\n );\n\n useLayoutEffect(\n () => () => {\n if (scheduledFrameRef.current !== null) {\n cancelAnimationFrame(scheduledFrameRef.current);\n }\n },\n [],\n );\n\n const hasActiveTopAnchor = useCallback(() => {\n const state = threadViewportStore.getState();\n return (\n state.turnAnchor === \"top\" &&\n state.element.viewport === divRef.current &&\n state.element.anchor !== null\n );\n }, [threadViewportStore]);\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = threadViewportStore.getState().isAtBottom;\n const newIsAtBottom =\n Math.abs(div.scrollHeight - div.scrollTop - div.clientHeight) <= 1 ||\n div.scrollHeight <= div.clientHeight;\n\n const isInFlightDownwardScroll =\n !newIsAtBottom && lastScrollTop.current < div.scrollTop;\n if (isInFlightDownwardScroll) {\n // no-op: a smooth scroll-to-bottom fires many midpoint scroll events\n // before landing, don't flicker isAtBottom or clear intent mid-animation\n } else {\n if (newIsAtBottom) {\n // newIsAtBottom is ambiguous when the viewport doesn't overflow —\n // keep intent alive until content can actually scroll\n const viewportOverflows = div.scrollHeight > div.clientHeight + 1;\n if (viewportOverflows) {\n scrollingToBottomBehaviorRef.current = null;\n }\n } else if (\n lastScrollTop.current > div.scrollTop &&\n lastScrollHeight.current === div.scrollHeight\n ) {\n // scrollHeight equality rules out content-driven shifts being misread as user scroll-up\n scrollingToBottomBehaviorRef.current = null;\n }\n\n const shouldUpdate =\n newIsAtBottom || scrollingToBottomBehaviorRef.current === null;\n\n if (shouldUpdate && newIsAtBottom !== isAtBottom) {\n writableStore(threadViewportStore).setState({\n isAtBottom: newIsAtBottom,\n });\n }\n }\n\n lastScrollTop.current = div.scrollTop;\n lastScrollHeight.current = div.scrollHeight;\n };\n\n const resizeRef = useOnResizeContent(() => {\n const div = divRef.current;\n if (!div) return;\n\n const { scrollHeight, clientHeight } = div;\n if (\n scrollHeight === lastObservedScrollHeight.current &&\n clientHeight === lastObservedClientHeight.current\n ) {\n return;\n }\n lastObservedScrollHeight.current = scrollHeight;\n lastObservedClientHeight.current = clientHeight;\n\n const scrollBehavior = scrollingToBottomBehaviorRef.current;\n if (scrollBehavior && hasActiveTopAnchor()) {\n // Let the top-anchor reserve own scrolling while a run starts to avoid a bottom-scroll race.\n scrollingToBottomBehaviorRef.current = null;\n } else if (scrollBehavior) {\n scrollToBottom(scrollBehavior);\n } else if (\n autoScroll &&\n !(isRunning && hasActiveTopAnchor()) &&\n threadViewportStore.getState().isAtBottom\n ) {\n scrollToBottom(\"instant\");\n }\n\n handleScroll();\n });\n\n const scrollRef = useManagedRef<HTMLElement>((el) => {\n // A pointer gesture invalidates pending bottom-scroll intent; otherwise an\n // intent kept alive by a non-overflowing thread (see handleScroll) hijacks\n // the next content growth, e.g. expanding a collapsible tool call.\n const cancelPendingScrollToBottom = () => {\n scrollingToBottomBehaviorRef.current = null;\n };\n el.addEventListener(\"scroll\", handleScroll);\n el.addEventListener(\"pointerdown\", cancelPendingScrollToBottom);\n return () => {\n el.removeEventListener(\"scroll\", handleScroll);\n el.removeEventListener(\"pointerdown\", cancelPendingScrollToBottom);\n };\n });\n\n useLayoutEffect(() => {\n if (!scrollToBottomOnInitialize) return;\n if (!hasMessages) {\n initializeScrollRequestedRef.current = false;\n return;\n }\n if (initializeScrollRequestedRef.current) return;\n\n initializeScrollRequestedRef.current = true;\n // defer to an in-flight run (e.g. first message on a new thread) that\n // already planted intent — otherwise we'd downgrade its \"auto\" to \"instant\"\n if (scrollingToBottomBehaviorRef.current !== null) return;\n scheduleScrollToBottom(\"instant\");\n }, [hasMessages, scheduleScrollToBottom, scrollToBottomOnInitialize]);\n\n useOnScrollToBottom(({ behavior }) => {\n scrollToBottom(behavior);\n });\n\n useAuiEvent(\"thread.runStart\", () => {\n if (!scrollToBottomOnRunStart) return;\n if (threadViewportStore.getState().turnAnchor === \"top\") return;\n scheduleScrollToBottom(\"auto\");\n });\n\n useAuiEvent(\"threadListItem.switchedTo\", () => {\n if (!scrollToBottomOnThreadSwitch) return;\n scheduleScrollToBottom(\"instant\");\n });\n\n const autoScrollRef = useComposedRefs<TElement>(resizeRef, scrollRef, divRef);\n return autoScrollRef as RefCallback<TElement>;\n};\n"],"mappings":"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"}
@@ -8,8 +8,6 @@ import { ThreadPrimitiveMessageByIndex, ThreadPrimitiveMessages, ThreadPrimitive
8
8
  import { ThreadPrimitiveScrollToBottom } from "./thread/ThreadScrollToBottom.js";
9
9
  import { ThreadPrimitiveSuggestion } from "./thread/ThreadSuggestion.js";
10
10
  import { ThreadPrimitiveSuggestionByIndex, ThreadPrimitiveSuggestions } from "./thread/ThreadSuggestions.js";
11
-
12
- //#region src/primitives/thread.d.ts
13
11
  declare namespace thread_d_exports {
14
12
  export { ThreadPrimitiveEmpty as Empty, ThreadPrimitiveIf as If, ThreadPrimitiveMessageByIndex as MessageByIndex, ThreadPrimitiveMessages as Messages, ThreadPrimitiveRoot as Root, ThreadPrimitiveScrollToBottom as ScrollToBottom, ThreadPrimitiveSuggestion as Suggestion, ThreadPrimitiveSuggestionByIndex as SuggestionByIndex, ThreadPrimitiveSuggestions as Suggestions, ThreadPrimitiveUnstable_MessageById as Unstable_MessageById, ThreadPrimitiveViewport as Viewport, ThreadPrimitiveViewportFooter as ViewportFooter, ThreadPrimitiveViewportProvider as ViewportProvider };
15
13
  }
@@ -1,5 +1,4 @@
1
1
  import { ActionButtonElement, ActionButtonProps } from "../../utils/createActionButton.js";
2
-
3
2
  //#region src/primitives/threadList/ThreadListLoadMore.d.ts
4
3
  declare const useThreadListLoadMore: () => (() => void) | null;
5
4
  declare namespace ThreadListPrimitiveLoadMore {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListLoadMore.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListLoadMore.tsx"],"mappings":";;;cASM,qBAAA;AAAA,kBAMW,2BAAA;EAAA,KACH,OAAA,GAAU,mBAAA;EAAA,KACV,KAAA,GAAQ,iBAAA,QAAyB,qBAAA;AAAA;AAAA,cAGlC,2BAAA,kBAA2B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,iBAAA,oBAAA,oBAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"ThreadListLoadMore.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListLoadMore.tsx"],"mappings":";;cASM;kBAMW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAGlC,6CAA2B,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;oBAGvC,cAAA,6CAAA,cAAA"}
@@ -1,5 +1,4 @@
1
1
  import { ActionButtonElement, ActionButtonProps } from "../../utils/createActionButton.js";
2
-
3
2
  //#region src/primitives/threadList/ThreadListNew.d.ts
4
3
  declare namespace ThreadListPrimitiveNew {
5
4
  type Element = ActionButtonElement;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListNew.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListNew.tsx"],"mappings":";;;kBAYiB,sBAAA;EAAA,KACH,OAAA,GAAU,mBAAA;EAAA,KACV,KAAA,GAAQ,iBAAiB;AAAA;AAAA,cAG1B,sBAAA,kBAAsB,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,iBAAA,oBAAA,oBAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"ThreadListNew.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListNew.tsx"],"mappings":";;kBAYiB;OACH,UAAU;OACV,QAAQ;;cAGT,wCAAsB,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;oBAoBjC,cAAA,6CAAA,cAAA"}
@@ -1,6 +1,5 @@
1
1
  import { Primitive } from "../../utils/Primitive.js";
2
2
  import { ComponentPropsWithoutRef, ComponentRef } from "react";
3
-
4
3
  //#region src/primitives/threadList/ThreadListRoot.d.ts
5
4
  type PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;
6
5
  declare namespace ThreadListPrimitiveRoot {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListRoot.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListRoot.tsx"],"mappings":";;;;KAUK,iBAAA,GAAoB,wBAAwB,QAAQ,SAAA,CAAU,GAAA;AAAA,kBAElD,uBAAA;EAAA,KACH,OAAA,GAAU,YAAA,QAAoB,SAAA,CAAU,GAAA;EAAA,KACxC,KAAA,GAAQ,iBAAA;AAAA;AAAA,cAGT,uBAAA,kBAAuB,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,cAAA,oBAAA,cAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"ThreadListRoot.d.ts","names":[],"sources":["../../../src/primitives/threadList/ThreadListRoot.tsx"],"mappings":";;;KAUK,oBAAoB,gCAAgC,UAAU;kBAElD;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ;;cAGT,yCAAuB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;oBAWlC,cAAA,0CAAA,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListRoot.js","names":["c","_c","Primitive","ComponentPropsWithoutRef","ComponentRef","forwardRef","ThreadListCollection","PrimitiveDivProps","div","ThreadListPrimitiveRoot","Element","Props","props","ref","$","t0","undefined","displayName"],"sources":["../../../src/primitives/threadList/ThreadListRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { ThreadListCollection } from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListPrimitiveRoot = forwardRef<\n ThreadListPrimitiveRoot.Element,\n ThreadListPrimitiveRoot.Props\n>((props, ref) => {\n return (\n <ThreadListCollection.Provider scope={undefined}>\n <ThreadListCollection.Slot scope={undefined}>\n <Primitive.div {...props} ref={ref} />\n </ThreadListCollection.Slot>\n </ThreadListCollection.Provider>\n );\n});\n\nThreadListPrimitiveRoot.displayName = \"ThreadListPrimitive.Root\";\n"],"mappings":";;;;;;;AAiBA,MAAaS,0BAA0BJ,YAGrCO,OAAAC,QAAA;CAAA,MAAAC,IAAAb,EAAA,CAAA;CAAA,IAAAc;CAAA,IAAAD,EAAA,OAAAF,SAAAE,EAAA,OAAAD,KAAA;EAEEE,KAAA,oBAAA,qBAAA,UAAA;GAAsCC,OAAAA,KAAAA;aACpC,oBAAA,qBAAA,MAAA;IAAkCA,OAAAA,KAAAA;cAChC,oBAAA,UAAA,KAAA;KAAA,GAAmBJ;KAAYC;IAAG,CAAA;GACpC,CAAA;EACF,CAAA;EAAgCC,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAAA,OAJhCC;AAIgC,CAEnC;AAEDN,wBAAwBQ,cAAc"}
1
+ {"version":3,"file":"ThreadListRoot.js","names":["c","_c","Primitive","ComponentPropsWithoutRef","ComponentRef","forwardRef","ThreadListCollection","PrimitiveDivProps","div","ThreadListPrimitiveRoot","Element","Props","props","ref","$","t0","undefined","displayName"],"sources":["../../../src/primitives/threadList/ThreadListRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { ThreadListCollection } from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListPrimitiveRoot = forwardRef<\n ThreadListPrimitiveRoot.Element,\n ThreadListPrimitiveRoot.Props\n>((props, ref) => {\n return (\n <ThreadListCollection.Provider scope={undefined}>\n <ThreadListCollection.Slot scope={undefined}>\n <Primitive.div {...props} ref={ref} />\n </ThreadListCollection.Slot>\n </ThreadListCollection.Provider>\n );\n});\n\nThreadListPrimitiveRoot.displayName = \"ThreadListPrimitive.Root\";\n"],"mappings":";;;;;;;AAiBA,MAAaS,0BAA0BJ,YAGrCO,OAAAC,QAAA;CAAA,MAAAC,IAAAb,EAAA,CAAA;CAAA,IAAAc;CAAA,IAAAD,EAAA,OAAAF,SAAAE,EAAA,OAAAD,KAAA;EAEEE,KAAA,oBAAA,qBAAA,UAAA;GAAsCC,OAAAA,KAAAA;GACpC,UAAA,oBAAA,qBAAA,MAAA;IAAkCA,OAAAA,KAAAA;IAChC,UAAA,oBAAA,UAAA,KAAA;KAAA,GAAmBJ;KAAYC;IAAG,CAAA;GACpC,CAAA;EACF,CAAA;EAAgCC,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAAA,OAJhCC;AAIgC,CAEnC;AAEDN,wBAAwBQ,cAAc"}
@@ -2,8 +2,6 @@ import { ThreadListPrimitiveNew } from "./threadList/ThreadListNew.js";
2
2
  import { ThreadListPrimitiveItemByIndex, ThreadListPrimitiveItems } from "./threadList/ThreadListItems.js";
3
3
  import { ThreadListPrimitiveLoadMore } from "./threadList/ThreadListLoadMore.js";
4
4
  import { ThreadListPrimitiveRoot } from "./threadList/ThreadListRoot.js";
5
-
6
- //#region src/primitives/threadList.d.ts
7
5
  declare namespace threadList_d_exports {
8
6
  export { ThreadListPrimitiveItemByIndex as ItemByIndex, ThreadListPrimitiveItems as Items, ThreadListPrimitiveLoadMore as LoadMore, ThreadListPrimitiveNew as New, ThreadListPrimitiveRoot as Root };
9
7
  }
@@ -1,5 +1,4 @@
1
1
  import { RefObject } from "react";
2
-
3
2
  //#region src/primitives/threadListFocusGroup.d.ts
4
3
  declare const useThreadListCollection: (scope: any) => () => {
5
4
  ref: RefObject<HTMLButtonElement | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"threadListFocusGroup.d.ts","names":[],"sources":["../../src/primitives/threadListFocusGroup.ts"],"mappings":";;;cAKmB,uBAAA,GAAuB,KAAA;OACS,SAAA,CAAA,iBAAA;AAAA;AAAA,cAEtC,oBAAA;EAAA;eAKgB,KAAA,CAAA,SAAA;;;;;;;;;KAFxB,mBAAA;EACH,UAAA,EAAY,SAAA,CAAU,iBAAA;EACtB,OAAA,EAAS,SAAA,CAAU,iBAAA;AAAA;AAAA,cAOR,2BAAA,kBAA2B,QAAA,CAAA,mBAAA;AAAA,cAE3B,sBAAA,QAA6B,mBAAmB"}
1
+ {"version":3,"file":"threadListFocusGroup.d.ts","names":[],"sources":["../../src/primitives/threadListFocusGroup.ts"],"mappings":";;cAKmB,0BAAuB;OAAvB,UAAA;;cAGN;;IAKe,WAAC,MAAA;;;;;;;;;KAFxB;EACH,YAAY,UAAU;EACtB,SAAS,UAAU;;cAOR,6CAA2B,SAAA;cAE3B,8BAA6B"}
@@ -1,5 +1,4 @@
1
1
  import { ActionButtonElement, ActionButtonProps } from "../../utils/createActionButton.js";
2
-
3
2
  //#region src/primitives/threadListItem/ThreadListItemArchive.d.ts
4
3
  declare const useThreadListItemArchive: () => () => void;
5
4
  declare namespace ThreadListItemPrimitiveArchive {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemArchive.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemArchive.ts"],"mappings":";;;cASM,wBAAA;AAAA,kBAKW,8BAAA;EAAA,KACH,OAAA,GAAU,mBAAA;EAAA,KACV,KAAA,GAAQ,iBAAA,QAAyB,wBAAA;AAAA;AAAA,cAGlC,8BAAA,kBAA8B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,iBAAA,oBAAA,oBAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"ThreadListItemArchive.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemArchive.ts"],"mappings":";;cASM;kBAKW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAGlC,gDAA8B,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;oBAG1C,cAAA,6CAAA,cAAA"}
@@ -1,5 +1,4 @@
1
1
  import { ActionButtonElement, ActionButtonProps } from "../../utils/createActionButton.js";
2
-
3
2
  //#region src/primitives/threadListItem/ThreadListItemDelete.d.ts
4
3
  declare const useThreadListItemDelete: () => () => void;
5
4
  declare namespace ThreadListItemPrimitiveDelete {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemDelete.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemDelete.ts"],"mappings":";;;cASM,uBAAA;AAAA,kBAKW,6BAAA;EAAA,KACH,OAAA,GAAU,mBAAA;EAAA,KACV,KAAA,GAAQ,iBAAA,QAAyB,uBAAA;AAAA;AAAA,cAGlC,6BAAA,kBAA6B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,iBAAA,oBAAA,oBAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"ThreadListItemDelete.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemDelete.ts"],"mappings":";;cASM;kBAKW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAGlC,+CAA6B,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;oBAGzC,cAAA,6CAAA,cAAA"}
@@ -1,6 +1,5 @@
1
1
  import { Primitive } from "../../utils/Primitive.js";
2
2
  import { ComponentPropsWithoutRef, ComponentRef } from "react";
3
-
4
3
  //#region src/primitives/threadListItem/ThreadListItemRoot.d.ts
5
4
  type PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;
6
5
  declare namespace ThreadListItemPrimitiveRoot {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemRoot.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"mappings":";;;;KAmBK,iBAAA,GAAoB,wBAAwB,QAAQ,SAAA,CAAU,GAAA;AAAA,kBAElD,2BAAA;EAAA,KACH,OAAA,GAAU,YAAA,QAAoB,SAAA,CAAU,GAAA;EAAA,KACxC,KAAA,GAAQ,iBAAA;AAAA;AAAA,cAGT,2BAAA,kBAA2B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,cAAA,oBAAA,cAAA,CAAA,cAAA"}
1
+ {"version":3,"file":"ThreadListItemRoot.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"mappings":";;;KAmBK,oBAAoB,gCAAgC,UAAU;kBAElD;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ;;cAGT,6CAA2B,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;oBAsDtC,cAAA,0CAAA,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemRoot.js","names":["Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","KeyboardEvent","useMemo","useRef","useAuiState","composeEventHandlers","Direction","ThreadListItemFocusProvider","useThreadListCollection","PrimitiveDivProps","div","ThreadListItemPrimitiveRoot","Element","Props","props","ref","isMain","s","threads","mainThreadId","threadListItem","id","triggerRef","HTMLButtonElement","moreRef","focus","getItems","undefined","direction","useDirection","onKeyDown","event","HTMLDivElement","forwardKey","backKey","trigger","current","more","target","key","triggers","map","item","filter","node","next","indexOf","preventDefault","displayName"],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Direction } from \"radix-ui\";\nimport {\n ThreadListItemFocusProvider,\n useThreadListCollection,\n} from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListItemPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListItemPrimitiveRoot = forwardRef<\n ThreadListItemPrimitiveRoot.Element,\n ThreadListItemPrimitiveRoot.Props\n>((props, ref) => {\n const isMain = useAuiState(\n (s) => s.threads.mainThreadId === s.threadListItem.id,\n );\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const moreRef = useRef<HTMLButtonElement | null>(null);\n const focus = useMemo(() => ({ triggerRef, moreRef }), []);\n\n const getItems = useThreadListCollection(undefined);\n const direction = Direction.useDirection();\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const forwardKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const backKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n const trigger = triggerRef.current;\n const more = moreRef.current;\n\n if (trigger && event.target === trigger) {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const triggers = getItems()\n .map((item) => item.ref.current)\n .filter((node): node is HTMLButtonElement => node !== null);\n const next =\n triggers[\n triggers.indexOf(trigger) + (event.key === \"ArrowDown\" ? 1 : -1)\n ];\n if (next) {\n next.focus();\n event.preventDefault();\n }\n } else if (event.key === forwardKey && more) {\n more.focus();\n event.preventDefault();\n }\n } else if (more && event.target === more && event.key === backKey) {\n trigger?.focus();\n event.preventDefault();\n }\n };\n\n return (\n <ThreadListItemFocusProvider value={focus}>\n <Primitive.div\n {...(isMain ? { \"data-active\": \"true\", \"aria-current\": \"true\" } : null)}\n {...props}\n onKeyDown={composeEventHandlers(props.onKeyDown, onKeyDown)}\n ref={ref}\n />\n </ThreadListItemFocusProvider>\n );\n});\n\nThreadListItemPrimitiveRoot.displayName = \"ThreadListItemPrimitive.Root\";\n"],"mappings":";;;;;;;;;AA0BA,MAAac,8BAA8BZ,YAGxCe,OAAOC,QAAQ;CAChB,MAAMC,SAASZ,aACZa,MAAMA,EAAEC,QAAQC,iBAAiBF,EAAEG,eAAeC,EACrD;CAEA,MAAMC,aAAanB,OAAiC,IAAI;CACxD,MAAMqB,UAAUrB,OAAiC,IAAI;CACrD,MAAMsB,QAAQvB,eAAe;EAAEoB;EAAYE;CAAQ,IAAI,CAAA,CAAE;CAEzD,MAAME,WAAWlB,wBAAwBmB,KAAAA,CAAS;CAClD,MAAMC,YAAYtB,UAAUuB,aAAa;CAEzC,MAAMC,aAAaC,UAAyC;EAC1D,MAAME,aAAaL,cAAc,QAAQ,cAAc;EACvD,MAAMM,UAAUN,cAAc,QAAQ,eAAe;EACrD,MAAMO,UAAUb,WAAWc;EAC3B,MAAMC,OAAOb,QAAQY;EAErB,IAAID,WAAWJ,MAAMO,WAAWH;OAC1BJ,MAAMQ,QAAQ,eAAeR,MAAMQ,QAAQ,WAAW;IACxD,MAAMC,WAAWd,SAAS,CAAC,CACxBe,KAAKC,SAASA,KAAK3B,IAAIqB,OAAO,CAAC,CAC/BO,QAAQC,SAAoCA,SAAS,IAAI;IAC5D,MAAMC,OACJL,SACEA,SAASM,QAAQX,OAAO,KAAKJ,MAAMQ,QAAQ,cAAc,IAAI;IAEjE,IAAIM,MAAM;KACRA,KAAKpB,MAAM;KACXM,MAAMgB,eAAe;IACvB;GACF,OAAO,IAAIhB,MAAMQ,QAAQN,cAAcI,MAAM;IAC3CA,KAAKZ,MAAM;IACXM,MAAMgB,eAAe;GACvB;SACK,IAAIV,QAAQN,MAAMO,WAAWD,QAAQN,MAAMQ,QAAQL,SAAS;GACjEC,SAASV,MAAM;GACfM,MAAMgB,eAAe;EACvB;CACF;CAEA,OACE,oBAAC,6BAAD;EAA6B,OAAOtB;YAClC,oBAAC,UAAU,KAAX;GACE,GAAKT,SAAS;IAAE,eAAe;IAAQ,gBAAgB;GAAO,IAAI;GAClE,GAAIF;GACJ,WAAWT,qBAAqBS,MAAMgB,WAAWA,SAAS;GACrDf;EAAI,CAAA;CAEgB,CAAA;AAEjC,CAAC;AAEDJ,4BAA4BqC,cAAc"}
1
+ {"version":3,"file":"ThreadListItemRoot.js","names":["Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","KeyboardEvent","useMemo","useRef","useAuiState","composeEventHandlers","Direction","ThreadListItemFocusProvider","useThreadListCollection","PrimitiveDivProps","div","ThreadListItemPrimitiveRoot","Element","Props","props","ref","isMain","s","threads","mainThreadId","threadListItem","id","triggerRef","HTMLButtonElement","moreRef","focus","getItems","undefined","direction","useDirection","onKeyDown","event","HTMLDivElement","forwardKey","backKey","trigger","current","more","target","key","triggers","map","item","filter","node","next","indexOf","preventDefault","displayName"],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Direction } from \"radix-ui\";\nimport {\n ThreadListItemFocusProvider,\n useThreadListCollection,\n} from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListItemPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListItemPrimitiveRoot = forwardRef<\n ThreadListItemPrimitiveRoot.Element,\n ThreadListItemPrimitiveRoot.Props\n>((props, ref) => {\n const isMain = useAuiState(\n (s) => s.threads.mainThreadId === s.threadListItem.id,\n );\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const moreRef = useRef<HTMLButtonElement | null>(null);\n const focus = useMemo(() => ({ triggerRef, moreRef }), []);\n\n const getItems = useThreadListCollection(undefined);\n const direction = Direction.useDirection();\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const forwardKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const backKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n const trigger = triggerRef.current;\n const more = moreRef.current;\n\n if (trigger && event.target === trigger) {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const triggers = getItems()\n .map((item) => item.ref.current)\n .filter((node): node is HTMLButtonElement => node !== null);\n const next =\n triggers[\n triggers.indexOf(trigger) + (event.key === \"ArrowDown\" ? 1 : -1)\n ];\n if (next) {\n next.focus();\n event.preventDefault();\n }\n } else if (event.key === forwardKey && more) {\n more.focus();\n event.preventDefault();\n }\n } else if (more && event.target === more && event.key === backKey) {\n trigger?.focus();\n event.preventDefault();\n }\n };\n\n return (\n <ThreadListItemFocusProvider value={focus}>\n <Primitive.div\n {...(isMain ? { \"data-active\": \"true\", \"aria-current\": \"true\" } : null)}\n {...props}\n onKeyDown={composeEventHandlers(props.onKeyDown, onKeyDown)}\n ref={ref}\n />\n </ThreadListItemFocusProvider>\n );\n});\n\nThreadListItemPrimitiveRoot.displayName = \"ThreadListItemPrimitive.Root\";\n"],"mappings":";;;;;;;;;AA0BA,MAAac,8BAA8BZ,YAGxCe,OAAOC,QAAQ;CAChB,MAAMC,SAASZ,aACZa,MAAMA,EAAEC,QAAQC,iBAAiBF,EAAEG,eAAeC,EACrD;CAEA,MAAMC,aAAanB,OAAiC,IAAI;CACxD,MAAMqB,UAAUrB,OAAiC,IAAI;CACrD,MAAMsB,QAAQvB,eAAe;EAAEoB;EAAYE;CAAQ,IAAI,CAAA,CAAE;CAEzD,MAAME,WAAWlB,wBAAwBmB,KAAAA,CAAS;CAClD,MAAMC,YAAYtB,UAAUuB,aAAa;CAEzC,MAAMC,aAAaC,UAAyC;EAC1D,MAAME,aAAaL,cAAc,QAAQ,cAAc;EACvD,MAAMM,UAAUN,cAAc,QAAQ,eAAe;EACrD,MAAMO,UAAUb,WAAWc;EAC3B,MAAMC,OAAOb,QAAQY;EAErB,IAAID,WAAWJ,MAAMO,WAAWH,SAC1BJ;OAAAA,MAAMQ,QAAQ,eAAeR,MAAMQ,QAAQ,WAAW;IACxD,MAAMC,WAAWd,SAAS,CAAC,CACxBe,KAAKC,SAASA,KAAK3B,IAAIqB,OAAO,CAAC,CAC/BO,QAAQC,SAAoCA,SAAS,IAAI;IAC5D,MAAMC,OACJL,SACEA,SAASM,QAAQX,OAAO,KAAKJ,MAAMQ,QAAQ,cAAc,IAAI;IAEjE,IAAIM,MAAM;KACRA,KAAKpB,MAAM;KACXM,MAAMgB,eAAe;IACvB;GACF,OAAO,IAAIhB,MAAMQ,QAAQN,cAAcI,MAAM;IAC3CA,KAAKZ,MAAM;IACXM,MAAMgB,eAAe;GACvB;SACK,IAAIV,QAAQN,MAAMO,WAAWD,QAAQN,MAAMQ,QAAQL,SAAS;GACjEC,SAASV,MAAM;GACfM,MAAMgB,eAAe;EACvB;CACF;CAEA,OACE,oBAAC,6BAAD;EAA6B,OAAOtB;EAClC,UAAA,oBAAC,UAAU,KAAX;GACE,GAAKT,SAAS;IAAE,eAAe;IAAQ,gBAAgB;GAAO,IAAI;GAClE,GAAIF;GACJ,WAAWT,qBAAqBS,MAAMgB,WAAWA,SAAS;GACrDf;EAAI,CAAA;CAEgB,CAAA;AAEjC,CAAC;AAEDJ,4BAA4BqC,cAAc"}
@@ -1,5 +1,4 @@
1
1
  import { ActionButtonElement, ActionButtonProps } from "../../utils/createActionButton.js";
2
-
3
2
  //#region src/primitives/threadListItem/ThreadListItemTrigger.d.ts
4
3
  declare const useThreadListItemTrigger: () => () => void;
5
4
  declare namespace ThreadListItemPrimitiveTrigger {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemTrigger.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemTrigger.tsx"],"mappings":";;;cAeM,wBAAA;AAAA,kBAKW,8BAAA;EAAA,KACH,OAAA,GAAU,mBAAA;EAAA,KACV,KAAA,GAAQ,iBAAA,QAAyB,wBAAA;AAAA;AAAA,cAQlC,8BAAA,kBAA8B,yBAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,iBAAA,oBAAA,oBAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"ThreadListItemTrigger.d.ts","names":[],"sources":["../../../src/primitives/threadListItem/ThreadListItemTrigger.tsx"],"mappings":";;cAeM;kBAKW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAQlC,gDAA8B,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;oBAYzC,cAAA,6CAAA,cAAA"}