@assistant-ui/react 0.15.31 → 0.15.32

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 (211) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +1 -2
  3. package/dist/assistant-transport.js +1 -2
  4. package/dist/cloud-renderer/CloudRendererHost.js +1 -2
  5. package/dist/context/ReadonlyStore.js +1 -2
  6. package/dist/context/providers/MessageProvider.js +1 -2
  7. package/dist/context/providers/ThreadViewportProvider.js +1 -2
  8. package/dist/context/react/ThreadViewportContext.js +1 -2
  9. package/dist/context/react/utils/createContextHook.js +1 -2
  10. package/dist/context/react/utils/createContextStoreHook.js +1 -2
  11. package/dist/context/stores/ThreadViewport.js +1 -2
  12. package/dist/devtools/DevToolsHooks.js +1 -2
  13. package/dist/hooks/useMessageQuote.js +1 -2
  14. package/dist/hooks/useMessageTiming.js +1 -2
  15. package/dist/hooks/useToolCallElapsed.js +1 -2
  16. package/dist/internal.js +1 -2
  17. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -2
  18. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  19. package/dist/mcp-apps/McpAppRenderer.js +3 -3
  20. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  21. package/dist/mcp-apps/McpAppsRemoteHost.js +1 -2
  22. package/dist/mcp-apps/app-frame.js +1 -2
  23. package/dist/mcp-apps/bridge.js +1 -2
  24. package/dist/mcp-apps/csp.js +1 -2
  25. package/dist/mcp-apps/types.js +1 -2
  26. package/dist/mcp-apps/utils.js +1 -2
  27. package/dist/model-context/frame/useAssistantFrameHost.js +1 -2
  28. package/dist/model-context/makeAssistantVisible.js +1 -2
  29. package/dist/primitives/actionBar/ActionBarCopy.js +1 -2
  30. package/dist/primitives/actionBar/ActionBarEdit.js +1 -2
  31. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +1 -2
  32. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -2
  33. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -2
  34. package/dist/primitives/actionBar/ActionBarInteractionContext.js +1 -2
  35. package/dist/primitives/actionBar/ActionBarReload.js +1 -2
  36. package/dist/primitives/actionBar/ActionBarRoot.js +1 -2
  37. package/dist/primitives/actionBar/ActionBarSpeak.js +1 -2
  38. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +1 -2
  39. package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -2
  40. package/dist/primitives/actionBar.js +1 -2
  41. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +1 -2
  42. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +1 -2
  43. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +1 -2
  44. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +1 -2
  45. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +1 -2
  46. package/dist/primitives/actionBarMore/scope.js +1 -2
  47. package/dist/primitives/actionBarMore.js +1 -2
  48. package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -2
  49. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -2
  50. package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -2
  51. package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -2
  52. package/dist/primitives/assistantModal/popoverRenderPrimitives.js +1 -2
  53. package/dist/primitives/assistantModal/scope.js +1 -2
  54. package/dist/primitives/assistantModal.js +1 -2
  55. package/dist/primitives/attachment/AttachmentName.js +1 -2
  56. package/dist/primitives/attachment/AttachmentRemove.js +1 -2
  57. package/dist/primitives/attachment/AttachmentRoot.js +1 -2
  58. package/dist/primitives/attachment/AttachmentThumb.js +1 -2
  59. package/dist/primitives/attachment.js +1 -2
  60. package/dist/primitives/branchPicker/BranchPickerCount.js +1 -2
  61. package/dist/primitives/branchPicker/BranchPickerNext.js +1 -2
  62. package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -2
  63. package/dist/primitives/branchPicker/BranchPickerPrevious.js +1 -2
  64. package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -2
  65. package/dist/primitives/branchPicker.js +1 -2
  66. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +5 -4
  67. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  68. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +57 -20
  69. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  70. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -2
  71. package/dist/primitives/chainOfThought.js +1 -2
  72. package/dist/primitives/composer/ComposerAddAttachment.js +1 -2
  73. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -2
  74. package/dist/primitives/composer/ComposerCancel.js +1 -2
  75. package/dist/primitives/composer/ComposerCompactContext.js +1 -2
  76. package/dist/primitives/composer/ComposerDictate.js +1 -2
  77. package/dist/primitives/composer/ComposerDictationTranscript.js +1 -2
  78. package/dist/primitives/composer/ComposerInput.js +1 -2
  79. package/dist/primitives/composer/ComposerInputPluginContext.js +1 -2
  80. package/dist/primitives/composer/ComposerQuote.js +1 -2
  81. package/dist/primitives/composer/ComposerResume.js +1 -2
  82. package/dist/primitives/composer/ComposerRoot.js +1 -2
  83. package/dist/primitives/composer/ComposerSend.js +1 -2
  84. package/dist/primitives/composer/ComposerStopDictation.js +1 -2
  85. package/dist/primitives/composer/composerInputSelector.js +1 -2
  86. package/dist/primitives/composer/trigger/TriggerPopover.js +1 -2
  87. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -2
  88. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +1 -2
  89. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +1 -2
  90. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -2
  91. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +1 -2
  92. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +1 -2
  93. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +1 -2
  94. package/dist/primitives/composer/trigger/detectTrigger.js +1 -2
  95. package/dist/primitives/composer/trigger/index.js +1 -2
  96. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +1 -2
  97. package/dist/primitives/composer/trigger/triggerDetectionResource.js +1 -2
  98. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +1 -2
  99. package/dist/primitives/composer/trigger/triggerNavigationResource.js +1 -2
  100. package/dist/primitives/composer/trigger/triggerSelectionResource.js +1 -2
  101. package/dist/primitives/composer/useComposerCancelWithFocus.js +1 -2
  102. package/dist/primitives/composer/useComposerInputState.js +1 -2
  103. package/dist/primitives/composer.js +1 -2
  104. package/dist/primitives/dropdownMenuRenderPrimitives.js +1 -2
  105. package/dist/primitives/error/ErrorMessage.js +1 -2
  106. package/dist/primitives/error/ErrorRoot.js +1 -2
  107. package/dist/primitives/error.js +1 -2
  108. package/dist/primitives/message/MessageError.js +1 -2
  109. package/dist/primitives/message/MessageIf.js +1 -2
  110. package/dist/primitives/message/MessageParts.js +1 -2
  111. package/dist/primitives/message/MessagePartsGrouped.js +1 -2
  112. package/dist/primitives/message/MessageRoot.js +1 -2
  113. package/dist/primitives/message.js +1 -2
  114. package/dist/primitives/messagePart/MessagePartImage.js +1 -2
  115. package/dist/primitives/messagePart/MessagePartText.js +1 -2
  116. package/dist/primitives/messagePart/useMessagePartData.js +1 -2
  117. package/dist/primitives/messagePart/useMessagePartFile.js +1 -2
  118. package/dist/primitives/messagePart/useMessagePartImage.js +1 -2
  119. package/dist/primitives/messagePart/useMessagePartReasoning.js +1 -2
  120. package/dist/primitives/messagePart/useMessagePartSource.js +1 -2
  121. package/dist/primitives/messagePart/useMessagePartText.js +1 -2
  122. package/dist/primitives/messagePart.js +1 -2
  123. package/dist/primitives/queueItem/QueueItemRemove.js +1 -2
  124. package/dist/primitives/queueItem/QueueItemSteer.js +1 -2
  125. package/dist/primitives/queueItem/QueueItemText.js +1 -2
  126. package/dist/primitives/queueItem.js +1 -2
  127. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
  128. package/dist/primitives/reasoning/useScrollLock.js +41 -25
  129. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  130. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -2
  131. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +1 -2
  132. package/dist/primitives/selectionToolbar.js +1 -2
  133. package/dist/primitives/suggestion/SuggestionDescription.js +1 -2
  134. package/dist/primitives/suggestion/SuggestionTitle.js +1 -2
  135. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -2
  136. package/dist/primitives/suggestion.js +1 -2
  137. package/dist/primitives/thread/ThreadEmpty.js +1 -2
  138. package/dist/primitives/thread/ThreadIf.js +1 -2
  139. package/dist/primitives/thread/ThreadLoadEarlier.js +1 -2
  140. package/dist/primitives/thread/ThreadRoot.js +1 -2
  141. package/dist/primitives/thread/ThreadRootElementContext.js +1 -2
  142. package/dist/primitives/thread/ThreadScrollToBottom.js +1 -2
  143. package/dist/primitives/thread/ThreadSuggestion.js +1 -2
  144. package/dist/primitives/thread/ThreadViewport.js +1 -2
  145. package/dist/primitives/thread/ThreadViewportFooter.js +1 -2
  146. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +1 -2
  147. package/dist/primitives/thread/topAnchor/createReserveObservers.js +1 -2
  148. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +1 -2
  149. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +1 -2
  150. package/dist/primitives/thread/topAnchor/topAnchorUtils.js +1 -2
  151. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +1 -2
  152. package/dist/primitives/thread/useThreadViewportAutoScroll.js +1 -2
  153. package/dist/primitives/thread.js +1 -2
  154. package/dist/primitives/threadList/ThreadListLoadMore.js +1 -2
  155. package/dist/primitives/threadList/ThreadListNew.js +1 -2
  156. package/dist/primitives/threadList/ThreadListRoot.js +1 -2
  157. package/dist/primitives/threadList.js +1 -2
  158. package/dist/primitives/threadListFocusGroup.js +1 -2
  159. package/dist/primitives/threadListItem/ThreadListItemArchive.js +1 -2
  160. package/dist/primitives/threadListItem/ThreadListItemDelete.js +1 -2
  161. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  162. package/dist/primitives/threadListItem/ThreadListItemRoot.js +2 -3
  163. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  164. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -2
  165. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +1 -2
  166. package/dist/primitives/threadListItem.js +1 -2
  167. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -2
  168. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +1 -2
  169. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -2
  170. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +1 -2
  171. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
  172. package/dist/primitives/threadListItemMore/scope.js +1 -2
  173. package/dist/primitives/threadListItemMore.js +1 -2
  174. package/dist/sandbox-host/SandboxHost.js +1 -2
  175. package/dist/unstable/useComposerInput.js +1 -2
  176. package/dist/unstable/useComposerInputHistory.js +1 -2
  177. package/dist/unstable/useLiveCompletionAdapter.js +1 -2
  178. package/dist/unstable/useMentionAdapter.js +1 -2
  179. package/dist/unstable/useMessageStallDetection.js +1 -2
  180. package/dist/unstable/useModelContextSnapshot.js +1 -2
  181. package/dist/unstable/useSlashCommandAdapter.js +1 -2
  182. package/dist/unstable/webmcp/WebMcpRegistrationResource.js +1 -2
  183. package/dist/unstable/webmcp/convertTools.js +1 -2
  184. package/dist/unstable/webmcp/useWebMcpProvider.js +1 -2
  185. package/dist/unstable/webmcp/webmcp-host.js +1 -2
  186. package/dist/utils/Primitive.js +1 -2
  187. package/dist/utils/createActionButton.js +1 -2
  188. package/dist/utils/getSelectionMessageId.js +1 -2
  189. package/dist/utils/hooks/useManagedRef.js +1 -2
  190. package/dist/utils/hooks/useMediaQuery.js +1 -2
  191. package/dist/utils/hooks/useOnScrollToBottom.js +1 -2
  192. package/dist/utils/hooks/useSizeHandle.js +1 -2
  193. package/dist/utils/isCompositionKey.js +1 -2
  194. package/dist/utils/smooth/SmoothContext.js +1 -2
  195. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  196. package/dist/utils/smooth/useSmooth.js +11 -4
  197. package/dist/utils/smooth/useSmooth.js.map +1 -1
  198. package/dist/utils/useIsomorphicLayoutEffect.js +0 -1
  199. package/package.json +6 -6
  200. package/src/mcp-apps/McpAppRenderer.composer.test.tsx +111 -0
  201. package/src/mcp-apps/McpAppRenderer.test.tsx +24 -23
  202. package/src/mcp-apps/McpAppRenderer.tsx +9 -1
  203. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.test.tsx +91 -0
  204. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.tsx +54 -0
  205. package/src/primitives/reasoning/useScrollLock.test.tsx +71 -2
  206. package/src/primitives/reasoning/useScrollLock.ts +78 -51
  207. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +4 -1
  208. package/src/primitives/threadListItem/ThreadListKeyboardNav.test.tsx +25 -0
  209. package/src/utils/smooth/useSmooth.test.tsx +113 -4
  210. package/src/utils/smooth/useSmooth.ts +16 -2
  211. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +0 -49
@@ -112,6 +112,31 @@ describe("thread list keyboard navigation", () => {
112
112
  expect(document.activeElement).toBe(first);
113
113
  });
114
114
 
115
+ it("skips disabled triggers in both directions without wrapping", () => {
116
+ const { container } = render(
117
+ <ThreadListPrimitiveRoot>
118
+ {[0, 1, 2].map((i) => (
119
+ <ThreadListItemPrimitiveRoot key={i}>
120
+ <ThreadListItemPrimitiveTrigger disabled={i === 1}>
121
+ item {i}
122
+ </ThreadListItemPrimitiveTrigger>
123
+ </ThreadListItemPrimitiveRoot>
124
+ ))}
125
+ </ThreadListPrimitiveRoot>,
126
+ );
127
+ const [first, , third] = triggers(container);
128
+
129
+ first!.focus();
130
+ expect(fireEvent.keyDown(first!, { key: "ArrowDown" })).toBe(false);
131
+ expect(document.activeElement).toBe(third);
132
+ expect(fireEvent.keyDown(third!, { key: "ArrowDown" })).toBe(true);
133
+ expect(document.activeElement).toBe(third);
134
+ expect(fireEvent.keyDown(third!, { key: "ArrowUp" })).toBe(false);
135
+ expect(document.activeElement).toBe(first);
136
+ expect(fireEvent.keyDown(first!, { key: "ArrowUp" })).toBe(true);
137
+ expect(document.activeElement).toBe(first);
138
+ });
139
+
115
140
  it("moves between an item and its More button with right/left arrows", () => {
116
141
  const { trigger, more } = renderItem();
117
142
 
@@ -8,12 +8,14 @@ import type {
8
8
  TextMessagePart,
9
9
  } from "@assistant-ui/core";
10
10
 
11
- const part = {};
12
- vi.mock("@assistant-ui/store", () => ({
13
- useAui: () => ({ part }),
11
+ const aui = vi.hoisted(() => ({ part: {} }));
12
+ vi.mock("@assistant-ui/store", async (importOriginal) => ({
13
+ ...(await importOriginal<typeof import("@assistant-ui/store")>()),
14
+ useAui: () => aui,
14
15
  useAuiState: (selector: () => unknown) => selector(),
15
16
  }));
16
- vi.mock("./SmoothContext", () => ({
17
+ vi.mock("./SmoothContext", async (importOriginal) => ({
18
+ ...(await importOriginal<typeof import("./SmoothContext")>()),
17
19
  useSmoothStatusStore: () => null,
18
20
  }));
19
21
 
@@ -163,6 +165,113 @@ describe("useSmooth", () => {
163
165
  expect(result.current.status.type).toBe("running");
164
166
  });
165
167
 
168
+ it("keeps completed text visible when smoothing is enabled", () => {
169
+ vi.spyOn(performance, "now").mockReturnValue(1000);
170
+ vi.spyOn(globalThis, "requestAnimationFrame").mockReturnValue(1);
171
+ vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {});
172
+ const { result, rerender } = renderHook(
173
+ ({ state, smooth }) => useSmooth(state, smooth),
174
+ { initialProps: { state: textState("Hello"), smooth: false } },
175
+ );
176
+ rerender({ state: runningState("Hello world"), smooth: false });
177
+ rerender({ state: textState("Hello world"), smooth: false });
178
+ expect(result.current.text).toBe("Hello world");
179
+
180
+ rerender({ state: textState("Hello world"), smooth: true });
181
+ expect(result.current.text).toBe("Hello world");
182
+ expect(result.current.status.type).toBe("complete");
183
+ });
184
+
185
+ it("starts a new part from its own cursor when enabling smoothing in the same update", () => {
186
+ let now = 1000;
187
+ let queued: FrameRequestCallback | undefined;
188
+ vi.spyOn(performance, "now").mockImplementation(() => now);
189
+ vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb) => {
190
+ queued = cb;
191
+ return 1;
192
+ });
193
+ vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {
194
+ queued = undefined;
195
+ });
196
+ const { result, rerender } = renderHook(
197
+ ({ state, smooth }) => useSmooth(state, smooth),
198
+ {
199
+ initialProps: {
200
+ state: runningState("Hello"),
201
+ smooth: false as boolean | SmoothOptions,
202
+ },
203
+ },
204
+ );
205
+ expect(result.current.text).toBe("Hello");
206
+
207
+ aui.part = {};
208
+ rerender({
209
+ state: runningState("Hello world"),
210
+ smooth: { maxCharsPerFrame: 1 },
211
+ });
212
+ expect(result.current.text).toBe("");
213
+ act(() => {
214
+ now += 16;
215
+ const callback = queued;
216
+ queued = undefined;
217
+ callback?.(now);
218
+ });
219
+ expect(result.current.text).toBe("H");
220
+ });
221
+
222
+ it.each([false, true])(
223
+ "animates only new text after reduced motion is disabled, with a part switch: %s",
224
+ (switchPart) => {
225
+ let now = 1000;
226
+ let queued: FrameRequestCallback | undefined;
227
+ vi.spyOn(performance, "now").mockImplementation(() => now);
228
+ vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb) => {
229
+ queued = cb;
230
+ return 1;
231
+ });
232
+ vi.spyOn(globalThis, "cancelAnimationFrame").mockImplementation(() => {
233
+ queued = undefined;
234
+ });
235
+ const listeners = new Set<() => void>();
236
+ const media = {
237
+ matches: true,
238
+ addEventListener: (_event: string, listener: () => void) =>
239
+ listeners.add(listener),
240
+ removeEventListener: (_event: string, listener: () => void) =>
241
+ listeners.delete(listener),
242
+ };
243
+ Object.defineProperty(window, "matchMedia", {
244
+ configurable: true,
245
+ value: () => media,
246
+ });
247
+ const { result, rerender } = renderHook(
248
+ (state) => useSmooth(state, { maxCharsPerFrame: 1 }),
249
+ { initialProps: runningState("Hello") },
250
+ );
251
+ if (switchPart) aui.part = {};
252
+ rerender(runningState("Hello world"));
253
+ expect(result.current.text).toBe("Hello world");
254
+
255
+ act(() => {
256
+ media.matches = false;
257
+ for (const listener of listeners) listener();
258
+ });
259
+ expect(result.current.text).toBe("Hello world");
260
+
261
+ rerender(runningState("Hello world!"));
262
+ expect(result.current.text).toBe("Hello world");
263
+ act(() => {
264
+ now += 16;
265
+ const callback = queued;
266
+ queued = undefined;
267
+ callback?.(now);
268
+ });
269
+ expect(result.current.text).toBe("Hello world!");
270
+ rerender(textState("Hello world!"));
271
+ expect(result.current.status.type).toBe("complete");
272
+ },
273
+ );
274
+
166
275
  it.each([
167
276
  { name: "negative drain time", options: { drainMs: -1 } },
168
277
  { name: "NaN character interval", options: { maxCharIntervalMs: NaN } },
@@ -217,6 +217,17 @@ export const useSmooth = (
217
217
  const [animatorRef] = useState(
218
218
  () => new TextStreamAnimator(displayedText, setText),
219
219
  );
220
+ const [prevEnabled, setPrevEnabled] = useState(enabled);
221
+ if (enabled !== prevEnabled) {
222
+ setPrevEnabled(enabled);
223
+ if (
224
+ enabled &&
225
+ part === prevPart &&
226
+ text.startsWith(animatorRef.currentText)
227
+ ) {
228
+ setDisplayedText(animatorRef.currentText);
229
+ }
230
+ }
220
231
 
221
232
  useEffect(() => {
222
233
  animatorRef.drainMs = drainMs;
@@ -227,13 +238,16 @@ export const useSmooth = (
227
238
 
228
239
  const animatorPartRef = useRef(part);
229
240
  useEffect(() => {
241
+ const partChanged = animatorPartRef.current !== part;
242
+ animatorPartRef.current = part;
230
243
  if (!enabled) {
231
244
  animatorRef.stop();
245
+ animatorRef.currentText = text;
246
+ animatorRef.targetText = text;
247
+ animatorRef.lastCommitTime = -Infinity;
232
248
  return;
233
249
  }
234
250
 
235
- const partChanged = animatorPartRef.current !== part;
236
- animatorPartRef.current = part;
237
251
  // A new part whose text shares a prefix with the previous target would
238
252
  // keep the stale cursor and flicker without this reset.
239
253
  if (partChanged || !text.startsWith(animatorRef.targetText)) {
@@ -1,49 +0,0 @@
1
- "use client";
2
-
3
- import {
4
- type ActionButtonElement,
5
- type ActionButtonProps,
6
- createActionButton,
7
- } from "../../utils/createActionButton";
8
- import { useCallback } from "react";
9
- import { useAuiState, useAui } from "@assistant-ui/store";
10
-
11
- const useChainOfThoughtAccordionTrigger = () => {
12
- const aui = useAui();
13
- const collapsed = useAuiState((s) => s.chainOfThought.collapsed);
14
-
15
- const callback = useCallback(() => {
16
- aui.chainOfThought.setCollapsed(!collapsed);
17
- }, [aui, collapsed]);
18
-
19
- return callback;
20
- };
21
-
22
- export namespace ChainOfThoughtPrimitiveAccordionTrigger {
23
- export type Element = ActionButtonElement;
24
- /**
25
- * Props for the ChainOfThoughtPrimitive.AccordionTrigger component.
26
- * Inherits all button element props and action button functionality.
27
- */
28
- export type Props = ActionButtonProps<
29
- typeof useChainOfThoughtAccordionTrigger
30
- >;
31
- }
32
-
33
- /**
34
- * A button component that toggles the collapsed state of the chain of thought accordion.
35
- *
36
- * This component automatically handles the toggle functionality, expanding or collapsing
37
- * the chain of thought parts when clicked.
38
- *
39
- * @example
40
- * ```tsx
41
- * <ChainOfThoughtPrimitive.AccordionTrigger>
42
- * Toggle Reasoning
43
- * </ChainOfThoughtPrimitive.AccordionTrigger>
44
- * ```
45
- */
46
- export const ChainOfThoughtPrimitiveAccordionTrigger = createActionButton(
47
- "ChainOfThoughtPrimitive.AccordionTrigger",
48
- useChainOfThoughtAccordionTrigger,
49
- );