@assistant-ui/react 0.12.28 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/client/ExternalThread.d.ts.map +1 -1
  2. package/dist/client/ExternalThread.js +0 -2
  3. package/dist/client/ExternalThread.js.map +1 -1
  4. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  5. package/dist/client/InMemoryThreadList.js +3 -0
  6. package/dist/client/InMemoryThreadList.js.map +1 -1
  7. package/dist/client/SingleThreadList.d.ts.map +1 -1
  8. package/dist/client/SingleThreadList.js +3 -0
  9. package/dist/client/SingleThreadList.js.map +1 -1
  10. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  11. package/dist/context/providers/ThreadViewportProvider.js +2 -10
  12. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  13. package/dist/context/stores/ThreadViewport.d.ts +46 -4
  14. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  15. package/dist/context/stores/ThreadViewport.js +51 -7
  16. package/dist/context/stores/ThreadViewport.js.map +1 -1
  17. package/dist/index.d.ts +1 -29
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -28
  20. package/dist/index.js.map +1 -1
  21. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts +1 -1
  22. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts.map +1 -1
  23. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js +1 -1
  24. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js.map +1 -1
  25. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  26. package/dist/primitives/composer/ComposerInput.js +9 -4
  27. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  28. package/dist/primitives/message/MessageRoot.d.ts +6 -30
  29. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  30. package/dist/primitives/message/MessageRoot.js +68 -25
  31. package/dist/primitives/message/MessageRoot.js.map +1 -1
  32. package/dist/primitives/thread/ThreadViewport.d.ts +38 -0
  33. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  34. package/dist/primitives/thread/ThreadViewport.js +53 -5
  35. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  36. package/dist/primitives/thread/ThreadViewportFooter.d.ts +2 -1
  37. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  38. package/dist/primitives/thread/ThreadViewportFooter.js +2 -1
  39. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  40. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +22 -0
  41. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -0
  42. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +53 -0
  43. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -0
  44. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts +5 -0
  45. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -0
  46. package/dist/primitives/thread/topAnchor/createReserveObservers.js +38 -0
  47. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -0
  48. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +22 -0
  49. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -0
  50. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +75 -0
  51. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -0
  52. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +15 -0
  53. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -0
  54. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +13 -0
  55. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -0
  56. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts +15 -0
  57. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -0
  58. package/dist/primitives/thread/topAnchor/topAnchorUtils.js +51 -0
  59. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -0
  60. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts +7 -0
  61. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -0
  62. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +18 -0
  63. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -0
  64. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  65. package/dist/primitives/thread/useThreadViewportAutoScroll.js +13 -1
  66. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  67. package/dist/primitives/thread.d.ts +0 -1
  68. package/dist/primitives/thread.d.ts.map +1 -1
  69. package/dist/primitives/thread.js +0 -1
  70. package/dist/primitives/thread.js.map +1 -1
  71. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +13 -0
  72. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -0
  73. package/dist/primitives/threadList/ThreadListLoadMore.js +11 -0
  74. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -0
  75. package/dist/primitives/threadList.d.ts +1 -0
  76. package/dist/primitives/threadList.d.ts.map +1 -1
  77. package/dist/primitives/threadList.js +1 -0
  78. package/dist/primitives/threadList.js.map +1 -1
  79. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  80. package/dist/utils/hooks/useManagedRef.js +1 -0
  81. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  82. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  83. package/dist/utils/hooks/useOnResizeContent.js +1 -2
  84. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  85. package/package.json +10 -10
  86. package/src/client/ExternalThread.ts +0 -2
  87. package/src/client/InMemoryThreadList.ts +3 -0
  88. package/src/client/SingleThreadList.ts +3 -0
  89. package/src/context/providers/ThreadViewportProvider.tsx +2 -12
  90. package/src/context/stores/ThreadViewport.ts +111 -11
  91. package/src/index.ts +0 -35
  92. package/src/legacy-runtime/runtime-cores/assistant-transport/utils.ts +1 -5
  93. package/src/primitives/composer/ComposerInput.test.tsx +232 -0
  94. package/src/primitives/composer/ComposerInput.tsx +9 -4
  95. package/src/primitives/message/MessageRoot.tsx +135 -57
  96. package/src/primitives/thread/ThreadViewport.tsx +95 -4
  97. package/src/primitives/thread/ThreadViewportFooter.tsx +2 -1
  98. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.test.ts +131 -0
  99. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.ts +94 -0
  100. package/src/primitives/thread/topAnchor/createReserveObservers.ts +50 -0
  101. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +131 -0
  102. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +127 -0
  103. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +46 -0
  104. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +30 -0
  105. package/src/primitives/thread/topAnchor/topAnchorUtils.ts +58 -0
  106. package/src/primitives/thread/topAnchor/useTopAnchorReserve.ts +19 -0
  107. package/src/primitives/thread/useThreadViewportAutoScroll.ts +15 -1
  108. package/src/primitives/thread.ts +0 -1
  109. package/src/primitives/threadList/ThreadListLoadMore.tsx +24 -0
  110. package/src/primitives/threadList.ts +1 -0
  111. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +138 -0
  112. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +28 -17
  113. package/src/utils/hooks/useManagedRef.ts +1 -0
  114. package/src/utils/hooks/useOnResizeContent.ts +1 -2
  115. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts +0 -3
  116. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts.map +0 -1
  117. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js +0 -3
  118. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js.map +0 -1
  119. package/dist/primitives/thread/ThreadViewportSlack.d.ts +0 -20
  120. package/dist/primitives/thread/ThreadViewportSlack.d.ts.map +0 -1
  121. package/dist/primitives/thread/ThreadViewportSlack.js +0 -80
  122. package/dist/primitives/thread/ThreadViewportSlack.js.map +0 -1
  123. package/src/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.ts +0 -6
  124. package/src/primitives/thread/ThreadViewportSlack.tsx +0 -116
@@ -161,13 +161,18 @@ export const ComposerPrimitiveInput = forwardRef(({ autoFocus = false, asChild,
161
161
  onChange: composeEventHandlers(onChange, (e) => {
162
162
  if (!aui.composer().getState().isEditing)
163
163
  return;
164
- const isComposing = e.nativeEvent.isComposing === true ||
165
- compositionRef.current;
166
- if (isComposing)
167
- return;
164
+ const nativeIsComposing = e.nativeEvent.isComposing === true;
165
+ // recover stuck compositionRef when the browser drops compositionend
166
+ if (compositionRef.current && !nativeIsComposing) {
167
+ compositionRef.current = false;
168
+ }
169
+ const isComposing = nativeIsComposing || compositionRef.current;
170
+ // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value
168
171
  flushResourcesSync(() => {
169
172
  aui.composer().setText(e.target.value);
170
173
  });
174
+ if (isComposing)
175
+ return;
171
176
  const pos = e.target.selectionStart ?? e.target.value.length;
172
177
  if (pluginRegistry) {
173
178
  for (const plugin of pluginRegistry.getPlugins()) {
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerInput.js","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ComposerInput.js","sourceRoot":"","sources":["../../../src/primitives/composer/ComposerInput.tsx"],"names":[],"mappings":"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"}
@@ -2,22 +2,7 @@ import { Primitive } from "../../utils/Primitive.js";
2
2
  import { type ComponentRef, type ComponentPropsWithoutRef } from "react";
3
3
  export declare namespace MessagePrimitiveRoot {
4
4
  type Element = ComponentRef<typeof Primitive.div>;
5
- /**
6
- * Props for the MessagePrimitive.Root component.
7
- * Accepts all standard div element props plus optional viewport slack tuning.
8
- */
9
- type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {
10
- /**
11
- * Threshold at which the user message height clamps to the offset.
12
- * @default "10em"
13
- */
14
- fillClampThreshold?: string | undefined;
15
- /**
16
- * Offset used when clamping large user messages.
17
- * @default "6em"
18
- */
19
- fillClampOffset?: string | undefined;
20
- };
5
+ type Props = ComponentPropsWithoutRef<typeof Primitive.div>;
21
6
  }
22
7
  /**
23
8
  * The root container component for a message.
@@ -26,8 +11,10 @@ export declare namespace MessagePrimitiveRoot {
26
11
  * hover state management for the message. It automatically tracks when the user
27
12
  * is hovering over the message, which can be used by child components like action bars.
28
13
  *
29
- * When `turnAnchor="top"` is set on the viewport, this component
30
- * registers itself as the scroll anchor if it's the last user message.
14
+ * When `turnAnchor="top"` is set on the viewport, this component automatically
15
+ * registers itself as the top-anchor user message (when it's the previous user
16
+ * message) or as the top-anchor target (when it's the streaming assistant
17
+ * response). No additional component is required.
31
18
  *
32
19
  * @example
33
20
  * ```tsx
@@ -44,16 +31,5 @@ export declare const MessagePrimitiveRoot: import("react").ForwardRefExoticCompo
44
31
  asChild?: boolean;
45
32
  }, "ref"> & {
46
33
  render?: import("react").ReactElement | undefined;
47
- } & import("react").RefAttributes<HTMLDivElement>, "ref"> & {
48
- /**
49
- * Threshold at which the user message height clamps to the offset.
50
- * @default "10em"
51
- */
52
- fillClampThreshold?: string | undefined;
53
- /**
54
- * Offset used when clamping large user messages.
55
- * @default "6em"
56
- */
57
- fillClampOffset?: string | undefined;
58
- } & import("react").RefAttributes<HTMLDivElement>>;
34
+ } & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
59
35
  //# sourceMappingURL=MessageRoot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/message/MessageRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAE9B,MAAM,OAAO,CAAC;AAqEf,yBAAiB,oBAAoB,CAAC;IACpC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD;;;OAGG;IACH,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG;QACnE;;;WAGG;QACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC;;;WAGG;QACH,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACtC,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB;;;;;IAlC7B;;;OAGG;yBACkB,MAAM,GAAG,SAAS;IACvC;;;OAGG;sBACe,MAAM,GAAG,SAAS;kDA8CtC,CAAC"}
1
+ {"version":3,"file":"MessageRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/message/MessageRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAG9B,MAAM,OAAO,CAAC;AA8Gf,yBAAiB,oBAAoB,CAAC;IACpC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;CACpE;AAsDD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB;;;;0GAkB/B,CAAC"}
@@ -4,10 +4,9 @@ import { Primitive } from "../../utils/Primitive.js";
4
4
  import { forwardRef, useCallback, } from "react";
5
5
  import { useAui, useAuiState } from "@assistant-ui/store";
6
6
  import { useManagedRef } from "../../utils/hooks/useManagedRef.js";
7
- import { useSizeHandle } from "../../utils/hooks/useSizeHandle.js";
8
7
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
9
- import { useThreadViewport } from "../../context/react/ThreadViewportContext.js";
10
- import { ThreadPrimitiveViewportSlack } from "../thread/ThreadViewportSlack.js";
8
+ import { useThreadViewport, useThreadViewportStore, } from "../../context/react/ThreadViewportContext.js";
9
+ import { parseCssLength } from "../thread/topAnchor/topAnchorUtils.js";
11
10
  const useIsHoveringRef = () => {
12
11
  const aui = useAui();
13
12
  const message = useAuiState(() => aui.message());
@@ -32,21 +31,61 @@ const useIsHoveringRef = () => {
32
31
  }, [message]);
33
32
  return useManagedRef(callbackRef);
34
33
  };
35
- /**
36
- * Hook that registers the anchor user message as a content inset.
37
- * Only registers if: user message, at index messages.length-2, and last message is assistant.
38
- */
39
- const useMessageViewportRef = () => {
40
- const turnAnchor = useThreadViewport((s) => s.turnAnchor);
41
- const registerUserHeight = useThreadViewport((s) => s.registerUserMessageHeight);
42
- // inset rules:
43
- // - the previous user message before the last assistant message registers its full height
44
- const shouldRegisterAsInset = useAuiState((s) => turnAnchor === "top" &&
45
- s.message.role === "user" &&
34
+ const useIsTopAnchorUser = () => {
35
+ const activeAnchorId = useThreadViewport((s) => s.topAnchorTurn?.anchorId);
36
+ return useAuiState((s) => s.message.role === "user" &&
37
+ s.message.index > 0 &&
46
38
  s.message.index === s.thread.messages.length - 2 &&
47
- s.thread.messages.at(-1)?.role === "assistant");
48
- const getHeight = useCallback((el) => el.offsetHeight, []);
49
- return useSizeHandle(shouldRegisterAsInset ? registerUserHeight : null, getHeight);
39
+ s.thread.messages.at(-1)?.role === "assistant" &&
40
+ (s.message.id === activeAnchorId || s.thread.isRunning));
41
+ };
42
+ const useIsTopAnchorTarget = () => {
43
+ const activeTargetId = useThreadViewport((s) => s.topAnchorTurn?.targetId);
44
+ return useAuiState((s) => s.message.isLast &&
45
+ s.message.role === "assistant" &&
46
+ s.message.index >= 1 &&
47
+ s.thread.messages.at(s.message.index - 1)?.role === "user" &&
48
+ (s.message.id === activeTargetId || s.thread.isRunning));
49
+ };
50
+ const useTopAnchorUserRef = (active, threadViewportStore) => {
51
+ const callback = useCallback((el) => {
52
+ if (!active)
53
+ return;
54
+ return threadViewportStore.getState().registerAnchorElement(el);
55
+ }, [active, threadViewportStore]);
56
+ return useManagedRef(callback);
57
+ };
58
+ const useTopAnchorTargetRef = ({ active, threadViewportStore, }) => {
59
+ const targetRefCallback = useCallback((el) => {
60
+ if (!active)
61
+ return;
62
+ const state = threadViewportStore.getState();
63
+ const clamp = state.topAnchorMessageClamp;
64
+ return state.registerAnchorTargetElement(el, {
65
+ tallerThan: parseCssLength(clamp.tallerThan, el),
66
+ visibleHeight: parseCssLength(clamp.visibleHeight, el),
67
+ });
68
+ }, [active, threadViewportStore]);
69
+ return useManagedRef(targetRefCallback);
70
+ };
71
+ const MessagePrimitiveRootDefault = ({ forwardedRef, ...props }) => {
72
+ const isHoveringRef = useIsHoveringRef();
73
+ const ref = useComposedRefs(forwardedRef, isHoveringRef);
74
+ const messageId = useAuiState((s) => s.message.id);
75
+ return _jsx(Primitive.div, { ...props, ref: ref, "data-message-id": messageId });
76
+ };
77
+ const MessagePrimitiveRootTopAnchor = ({ forwardedRef, threadViewportStore, ...props }) => {
78
+ const isHoveringRef = useIsHoveringRef();
79
+ const isTopAnchorUser = useIsTopAnchorUser();
80
+ const isTopAnchorTarget = useIsTopAnchorTarget();
81
+ const topAnchorUserRef = useTopAnchorUserRef(isTopAnchorUser, threadViewportStore);
82
+ const topAnchorTargetRef = useTopAnchorTargetRef({
83
+ active: isTopAnchorTarget,
84
+ threadViewportStore,
85
+ });
86
+ const ref = useComposedRefs(forwardedRef, isHoveringRef, topAnchorUserRef, topAnchorTargetRef);
87
+ const messageId = useAuiState((s) => s.message.id);
88
+ return (_jsx(Primitive.div, { ...props, ref: ref, "data-message-id": messageId, "data-aui-top-anchor-user": isTopAnchorUser ? "" : undefined, "data-aui-top-anchor-target": isTopAnchorTarget ? "" : undefined }));
50
89
  };
51
90
  /**
52
91
  * The root container component for a message.
@@ -55,8 +94,10 @@ const useMessageViewportRef = () => {
55
94
  * hover state management for the message. It automatically tracks when the user
56
95
  * is hovering over the message, which can be used by child components like action bars.
57
96
  *
58
- * When `turnAnchor="top"` is set on the viewport, this component
59
- * registers itself as the scroll anchor if it's the last user message.
97
+ * When `turnAnchor="top"` is set on the viewport, this component automatically
98
+ * registers itself as the top-anchor user message (when it's the previous user
99
+ * message) or as the top-anchor target (when it's the streaming assistant
100
+ * response). No additional component is required.
60
101
  *
61
102
  * @example
62
103
  * ```tsx
@@ -69,12 +110,14 @@ const useMessageViewportRef = () => {
69
110
  * </MessagePrimitive.Root>
70
111
  * ```
71
112
  */
72
- export const MessagePrimitiveRoot = forwardRef(({ fillClampThreshold, fillClampOffset, ...props }, forwardRef) => {
73
- const isHoveringRef = useIsHoveringRef();
74
- const anchorUserMessageRef = useMessageViewportRef();
75
- const ref = useComposedRefs(forwardRef, isHoveringRef, anchorUserMessageRef);
76
- const messageId = useAuiState((s) => s.message.id);
77
- return (_jsx(ThreadPrimitiveViewportSlack, { fillClampThreshold: fillClampThreshold, fillClampOffset: fillClampOffset, children: _jsx(Primitive.div, { ...props, ref: ref, "data-message-id": messageId }) }));
113
+ export const MessagePrimitiveRoot = forwardRef((props, forwardedRef) => {
114
+ const threadViewportStore = useThreadViewportStore();
115
+ // turnAnchor is initial-only viewport config (see ThreadViewportProvider).
116
+ const turnAnchor = threadViewportStore.getState().turnAnchor;
117
+ if (turnAnchor === "top") {
118
+ return (_jsx(MessagePrimitiveRootTopAnchor, { ...props, forwardedRef: forwardedRef, threadViewportStore: threadViewportStore }));
119
+ }
120
+ return _jsx(MessagePrimitiveRootDefault, { ...props, forwardedRef: forwardedRef });
78
121
  });
79
122
  MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
80
123
  //# sourceMappingURL=MessageRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageRoot.js","sourceRoot":"","sources":["../../../src/primitives/message/MessageRoot.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageRoot.js","sourceRoot":"","sources":["../../../src/primitives/message/MessageRoot.tsx"],"names":[],"mappings":"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"}
@@ -16,6 +16,25 @@ export declare namespace ThreadPrimitiveViewport {
16
16
  * - "top": New user messages anchor at the top of the viewport for a focused reading experience.
17
17
  */
18
18
  turnAnchor?: "top" | "bottom" | undefined;
19
+ /**
20
+ * Clamps tall user messages so the assistant response stays in view.
21
+ *
22
+ * @default { tallerThan: "10em", visibleHeight: "6em" }
23
+ */
24
+ topAnchorMessageClamp?: {
25
+ /**
26
+ * Clamp messages taller than this. Supports `px`, `em`, and `rem`.
27
+ *
28
+ * @default "10em"
29
+ */
30
+ tallerThan?: string;
31
+ /**
32
+ * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.
33
+ *
34
+ * @default "6em"
35
+ */
36
+ visibleHeight?: string;
37
+ };
19
38
  /**
20
39
  * Whether to scroll to bottom when a new run starts.
21
40
  *
@@ -70,6 +89,25 @@ export declare const ThreadPrimitiveViewport: import("react").ForwardRefExoticCo
70
89
  * - "top": New user messages anchor at the top of the viewport for a focused reading experience.
71
90
  */
72
91
  turnAnchor?: "top" | "bottom" | undefined;
92
+ /**
93
+ * Clamps tall user messages so the assistant response stays in view.
94
+ *
95
+ * @default { tallerThan: "10em", visibleHeight: "6em" }
96
+ */
97
+ topAnchorMessageClamp?: {
98
+ /**
99
+ * Clamp messages taller than this. Supports `px`, `em`, and `rem`.
100
+ *
101
+ * @default "10em"
102
+ */
103
+ tallerThan?: string;
104
+ /**
105
+ * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.
106
+ *
107
+ * @default "6em"
108
+ */
109
+ visibleHeight?: string;
110
+ };
73
111
  /**
74
112
  * Whether to scroll to bottom when a new run starts.
75
113
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAE9B,MAAM,OAAO,CAAC;AAMf,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG;QACnE;;;;;WAKG;QACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjC;;;;WAIG;QACH,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;QAE1C;;;;WAIG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAE/C;;;;WAIG;QACH,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjD;;;;WAIG;QACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AA2CD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uBAAuB;;;;;IA/FhC;;;;;OAKG;iBACU,OAAO,GAAG,SAAS;IAEhC;;;;OAIG;iBACU,KAAK,GAAG,QAAQ,GAAG,SAAS;IAEzC;;;;OAIG;+BACwB,OAAO,GAAG,SAAS;IAE9C;;;;OAIG;iCAC0B,OAAO,GAAG,SAAS;IAEhD;;;;OAIG;mCAC4B,OAAO,GAAG,SAAS;kDAsEpD,CAAC"}
1
+ {"version":3,"file":"ThreadViewport.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAI9B,MAAM,OAAO,CAAC;AAgBf,yBAAiB,uBAAuB,CAAC;IACvC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG;QACnE;;;;;WAKG;QACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjC;;;;WAIG;QACH,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;QAE1C;;;;WAIG;QACH,qBAAqB,CAAC,EAAE;YACtB;;;;eAIG;YACH,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB;;;;eAIG;YACH,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;QAEF;;;;WAIG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAE/C;;;;WAIG;QACH,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjD;;;;WAIG;QACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AAoGD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uBAAuB;;;;;IA5KhC;;;;;OAKG;iBACU,OAAO,GAAG,SAAS;IAEhC;;;;OAIG;iBACU,KAAK,GAAG,QAAQ,GAAG,SAAS;IAEzC;;;;OAIG;4BACqB;QACtB;;;;WAIG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAED;;;;OAIG;+BACwB,OAAO,GAAG,SAAS;IAE9C;;;;OAIG;iCAC0B,OAAO,GAAG,SAAS;IAEhD;;;;OAIG;mCAC4B,OAAO,GAAG,SAAS;kDAiIpD,CAAC"}
@@ -2,16 +2,58 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
4
4
  import { Primitive } from "../../utils/Primitive.js";
5
- import { forwardRef, useCallback, } from "react";
5
+ import { forwardRef, useCallback, useLayoutEffect, useMemo, } from "react";
6
+ import { useAuiEvent, useAuiState } from "@assistant-ui/store";
7
+ import { useManagedRef } from "../../utils/hooks/useManagedRef.js";
6
8
  import { useThreadViewportAutoScroll } from "./useThreadViewportAutoScroll.js";
7
9
  import { ThreadPrimitiveViewportProvider } from "../../context/providers/ThreadViewportProvider.js";
8
10
  import { useSizeHandle } from "../../utils/hooks/useSizeHandle.js";
9
- import { useThreadViewport } from "../../context/react/ThreadViewportContext.js";
11
+ import { useThreadViewport, useThreadViewportStore, } from "../../context/react/ThreadViewportContext.js";
12
+ import { useTopAnchorReserve } from "./topAnchor/useTopAnchorReserve.js";
13
+ import { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId, } from "./topAnchor/topAnchorTurn.js";
10
14
  const useViewportSizeRef = () => {
11
15
  const register = useThreadViewport((s) => s.registerViewport);
12
16
  const getHeight = useCallback((el) => el.clientHeight, []);
13
17
  return useSizeHandle(register, getHeight);
14
18
  };
19
+ const useViewportElementRef = () => {
20
+ const registerViewportElement = useThreadViewport((s) => s.registerViewportElement);
21
+ return useManagedRef(registerViewportElement);
22
+ };
23
+ const useTopAnchorTurn = (enabled) => {
24
+ const threadViewportStore = useThreadViewportStore();
25
+ const activeAnchorId = useAuiState((s) => {
26
+ if (!enabled)
27
+ return undefined;
28
+ return getActiveTopAnchorAnchorId(s.thread);
29
+ });
30
+ const activeTargetId = useAuiState((s) => {
31
+ if (!enabled)
32
+ return undefined;
33
+ return getActiveTopAnchorTargetId(s.thread);
34
+ });
35
+ const activeTurn = useMemo(() => {
36
+ if (!activeAnchorId || !activeTargetId)
37
+ return null;
38
+ return { anchorId: activeAnchorId, targetId: activeTargetId };
39
+ }, [activeAnchorId, activeTargetId]);
40
+ useLayoutEffect(() => {
41
+ if (!activeTurn)
42
+ return;
43
+ const state = threadViewportStore.getState();
44
+ const current = state.topAnchorTurn;
45
+ if (current?.anchorId === activeTurn.anchorId &&
46
+ current.targetId === activeTurn.targetId) {
47
+ return;
48
+ }
49
+ state.setTopAnchorTurn(activeTurn);
50
+ }, [activeTurn, threadViewportStore]);
51
+ const clearTopAnchorTurn = useCallback(() => {
52
+ threadViewportStore.getState().setTopAnchorTurn(null);
53
+ }, [threadViewportStore]);
54
+ useAuiEvent("thread.initialize", clearTopAnchorTurn);
55
+ useAuiEvent("threadListItem.switchedTo", clearTopAnchorTurn);
56
+ };
15
57
  const ThreadPrimitiveViewportScrollable = forwardRef(({ autoScroll, scrollToBottomOnRunStart, scrollToBottomOnInitialize, scrollToBottomOnThreadSwitch, children, ...rest }, forwardedRef) => {
16
58
  const autoScrollRef = useThreadViewportAutoScroll({
17
59
  autoScroll,
@@ -20,7 +62,13 @@ const ThreadPrimitiveViewportScrollable = forwardRef(({ autoScroll, scrollToBott
20
62
  scrollToBottomOnThreadSwitch,
21
63
  });
22
64
  const viewportSizeRef = useViewportSizeRef();
23
- const ref = useComposedRefs(forwardedRef, autoScrollRef, viewportSizeRef);
65
+ const viewportElementRef = useViewportElementRef();
66
+ const threadViewportStore = useThreadViewportStore();
67
+ const turnAnchor = threadViewportStore.getState().turnAnchor;
68
+ const topAnchorEnabled = turnAnchor === "top";
69
+ useTopAnchorTurn(topAnchorEnabled);
70
+ useTopAnchorReserve(topAnchorEnabled);
71
+ const ref = useComposedRefs(forwardedRef, autoScrollRef, viewportSizeRef, viewportElementRef);
24
72
  return (_jsx(Primitive.div, { ...rest, ref: ref, children: children }));
25
73
  });
26
74
  ThreadPrimitiveViewportScrollable.displayName =
@@ -41,8 +89,8 @@ ThreadPrimitiveViewportScrollable.displayName =
41
89
  * </ThreadPrimitive.Viewport>
42
90
  * ```
43
91
  */
44
- export const ThreadPrimitiveViewport = forwardRef(({ turnAnchor, ...props }, ref) => {
45
- return (_jsx(ThreadPrimitiveViewportProvider, { options: { turnAnchor }, children: _jsx(ThreadPrimitiveViewportScrollable, { ...props, ref: ref }) }));
92
+ export const ThreadPrimitiveViewport = forwardRef(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {
93
+ return (_jsx(ThreadPrimitiveViewportProvider, { options: { turnAnchor, topAnchorMessageClamp }, children: _jsx(ThreadPrimitiveViewportScrollable, { ...props, ref: ref }) }));
46
94
  });
47
95
  ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
48
96
  //# sourceMappingURL=ThreadViewport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.js","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EAEL,UAAU,EAEV,WAAW,GACZ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,2BAA2B,EAAE,yCAAsC;AAC5E,OAAO,EAAE,+BAA+B,EAAE,0DAAuD;AACjG,OAAO,EAAE,aAAa,EAAE,2CAAwC;AAChE,OAAO,EAAE,iBAAiB,EAAE,qDAAkD;AA2C9E,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,EAAe,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG,UAAU,CAIlD,CACE,EACE,UAAU,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,QAAQ,EACR,GAAG,IAAI,EACR,EACD,YAAY,EACZ,EAAE;IACF,MAAM,aAAa,GAAG,2BAA2B,CAAiB;QAChE,UAAU;QACV,wBAAwB;QACxB,0BAA0B;QAC1B,4BAA4B;KAC7B,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IAE1E,OAAO,CACL,KAAC,SAAS,CAAC,GAAG,OAAK,IAAI,EAAE,GAAG,EAAE,GAAG,YAC9B,QAAQ,GACK,CACjB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,iCAAiC,CAAC,WAAW;IAC3C,oCAAoC,CAAC;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAG/C,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAClC,OAAO,CACL,KAAC,+BAA+B,IAAC,OAAO,EAAE,EAAE,UAAU,EAAE,YACtD,KAAC,iCAAiC,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,GAC1B,CACnC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,uBAAuB,CAAC,WAAW,GAAG,0BAA0B,CAAC"}
1
+ {"version":3,"file":"ThreadViewport.js","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"names":[],"mappings":"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"}
@@ -8,7 +8,8 @@ export declare namespace ThreadPrimitiveViewportFooter {
8
8
  * A footer container that measures its height for scroll calculations.
9
9
  *
10
10
  * This component measures its height and provides it to the viewport context
11
- * for use in scroll calculations (e.g., ViewportSlack min-height).
11
+ * so the auto-scroll system can account for any sticky footer overlapping the
12
+ * message list.
12
13
  *
13
14
  * Multiple ViewportFooter components can be used - their heights are summed.
14
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewportFooter.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAE9B,MAAM,OAAO,CAAC;AAIf,yBAAiB,6BAA6B,CAAC;IAC7C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;CACpE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,6BAA6B;;;;0GAexC,CAAC"}
1
+ {"version":3,"file":"ThreadViewportFooter.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAE9B,MAAM,OAAO,CAAC;AAIf,yBAAiB,6BAA6B,CAAC;IAC7C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;CACpE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,6BAA6B;;;;0GAexC,CAAC"}
@@ -9,7 +9,8 @@ import { useThreadViewport } from "../../context/react/ThreadViewportContext.js"
9
9
  * A footer container that measures its height for scroll calculations.
10
10
  *
11
11
  * This component measures its height and provides it to the viewport context
12
- * for use in scroll calculations (e.g., ViewportSlack min-height).
12
+ * so the auto-scroll system can account for any sticky footer overlapping the
13
+ * message list.
13
14
  *
14
15
  * Multiple ViewportFooter components can be used - their heights are summed.
15
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewportFooter.js","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EAEL,UAAU,EAEV,WAAW,GACZ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,2CAAwC;AAChE,OAAO,EAAE,iBAAiB,EAAE,qDAAkD;AAO9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,UAAU,CAGrD,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,EAAe,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAErD,OAAO,KAAC,SAAS,CAAC,GAAG,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,6BAA6B,CAAC,WAAW,GAAG,gCAAgC,CAAC"}
1
+ {"version":3,"file":"ThreadViewportFooter.js","sourceRoot":"","sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EAEL,UAAU,EAEV,WAAW,GACZ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,2CAAwC;AAChE,OAAO,EAAE,iBAAiB,EAAE,qDAAkD;AAO9E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,UAAU,CAGrD,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,EAAe,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAErD,OAAO,KAAC,SAAS,CAAC,GAAG,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,6BAA6B,CAAC,WAAW,GAAG,gCAAgC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type ComputeTopAnchorTargetOptions = {
2
+ viewport: HTMLElement;
3
+ anchor: HTMLElement;
4
+ tallerThan: number;
5
+ visibleHeight: number;
6
+ };
7
+ export type ComputeTopAnchorReserveOptions = ComputeTopAnchorTargetOptions & {
8
+ reserve: HTMLElement;
9
+ };
10
+ /**
11
+ * Compute the scroll position that pins the anchor (last user message) to the
12
+ * top of the viewport. For tall user messages the anchor is intentionally
13
+ * over-scrolled so only `visibleHeight` of it remains visible, leaving room
14
+ * for the assistant message below.
15
+ *
16
+ * Depends only on the anchor's offset within the scroll content; never reads
17
+ * `viewport.scrollHeight` (which is volatile while the assistant message
18
+ * streams in).
19
+ */
20
+ export declare const computeTopAnchorTargetScrollTop: ({ viewport, anchor, tallerThan, visibleHeight, }: ComputeTopAnchorTargetOptions) => number;
21
+ export declare const computeTopAnchorReserve: ({ viewport, reserve, ...targetOptions }: ComputeTopAnchorReserveOptions) => number;
22
+ //# sourceMappingURL=computeTopAnchorSlack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeTopAnchorSlack.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,6BAA6B,GAAG;IAC3E,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAqCF;;;;;;;;;GASG;AACH,eAAO,MAAM,+BAA+B,GAAI,kDAK7C,6BAA6B,KAAG,MAOlC,CAAC;AAaF,eAAO,MAAM,uBAAuB,GAAI,yCAIrC,8BAA8B,KAAG,MAMnC,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ const getDocumentOffsetTop = (element) => {
3
+ let top = 0;
4
+ let current = element;
5
+ while (current) {
6
+ top += current.offsetTop;
7
+ current = current.offsetParent;
8
+ }
9
+ return top;
10
+ };
11
+ const getLayoutOffsetTop = (element, ancestor) => {
12
+ // Use layout geometry, not visual rects, so entrance transforms/animations
13
+ // on the anchor do not shift the scroll target while they settle.
14
+ let top = 0;
15
+ let current = element;
16
+ while (current && current !== ancestor) {
17
+ top += current.offsetTop;
18
+ current = current.offsetParent;
19
+ }
20
+ if (current === ancestor)
21
+ return top;
22
+ return getDocumentOffsetTop(element) - getDocumentOffsetTop(ancestor);
23
+ };
24
+ /**
25
+ * Compute the scroll position that pins the anchor (last user message) to the
26
+ * top of the viewport. For tall user messages the anchor is intentionally
27
+ * over-scrolled so only `visibleHeight` of it remains visible, leaving room
28
+ * for the assistant message below.
29
+ *
30
+ * Depends only on the anchor's offset within the scroll content; never reads
31
+ * `viewport.scrollHeight` (which is volatile while the assistant message
32
+ * streams in).
33
+ */
34
+ export const computeTopAnchorTargetScrollTop = ({ viewport, anchor, tallerThan, visibleHeight, }) => {
35
+ const anchorTop = getLayoutOffsetTop(anchor, viewport);
36
+ const anchorHeight = anchor.offsetHeight;
37
+ const visibleAnchorHeight = anchorHeight <= tallerThan ? anchorHeight : visibleHeight;
38
+ return anchorTop + Math.max(0, anchorHeight - visibleAnchorHeight);
39
+ };
40
+ const computeTopAnchorSlack = ({ scrollHeight, ...targetOptions }) => {
41
+ const { viewport } = targetOptions;
42
+ const targetScrollTop = computeTopAnchorTargetScrollTop(targetOptions);
43
+ const targetScrollHeight = targetScrollTop + viewport.clientHeight;
44
+ return Math.max(0, targetScrollHeight - scrollHeight);
45
+ };
46
+ export const computeTopAnchorReserve = ({ viewport, reserve, ...targetOptions }) => {
47
+ return computeTopAnchorSlack({
48
+ viewport,
49
+ ...targetOptions,
50
+ scrollHeight: viewport.scrollHeight - reserve.offsetHeight,
51
+ });
52
+ };
53
+ //# sourceMappingURL=computeTopAnchorSlack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeTopAnchorSlack.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAiBb,MAAM,oBAAoB,GAAG,CAAC,OAAoB,EAAU,EAAE;IAC5D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,OAAO,GAAuB,OAAO,CAAC;IAE1C,OAAO,OAAO,EAAE,CAAC;QACf,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;QACzB,OAAO,GAAG,OAAO,CAAC,YAAkC,CAAC;IACvD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACzB,OAAoB,EACpB,QAAqB,EACb,EAAE;IACV,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,OAAO,GAAuB,OAAO,CAAC;IAE1C,OAAO,OAAO,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;QACzB,OAAO,GAAG,OAAO,CAAC,YAAkC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAErC,OAAO,oBAAoB,CAAC,OAAO,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,EAC9C,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAa,GACiB,EAAU,EAAE;IAC1C,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACzC,MAAM,mBAAmB,GACvB,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IAE5D,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,EAC7B,YAAY,EACZ,GAAG,aAAa,EACa,EAAU,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;IACnC,MAAM,eAAe,GAAG,+BAA+B,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,eAAe,GAAG,QAAQ,CAAC,YAAY,CAAC;IAEnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EACtC,QAAQ,EACR,OAAO,EACP,GAAG,aAAa,EACe,EAAU,EAAE;IAC3C,OAAO,qBAAqB,CAAC;QAC3B,QAAQ;QACR,GAAG,aAAa;QAChB,YAAY,EAAE,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;KAC3D,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const createReserveObservers: (onChange: () => void) => {
2
+ target: (viewport: HTMLElement, anchor: HTMLElement, target: HTMLElement) => void;
3
+ disconnect: () => void;
4
+ };
5
+ //# sourceMappingURL=createReserveObservers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReserveObservers.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,GAAI,UAAU,MAAM,IAAI;uBAkB3C,WAAW,UACb,WAAW,UACX,WAAW;;CA2BxB,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ export const createReserveObservers = (onChange) => {
3
+ const resizeObserver = new ResizeObserver(onChange);
4
+ const mutationObserver = new MutationObserver(onChange);
5
+ let observedViewport = null;
6
+ let observedAnchor = null;
7
+ let observedTarget = null;
8
+ const disconnect = () => {
9
+ resizeObserver.disconnect();
10
+ mutationObserver.disconnect();
11
+ observedViewport = null;
12
+ observedAnchor = null;
13
+ observedTarget = null;
14
+ };
15
+ return {
16
+ target: (viewport, anchor, target) => {
17
+ if (observedViewport === viewport &&
18
+ observedAnchor === anchor &&
19
+ observedTarget === target) {
20
+ return;
21
+ }
22
+ disconnect();
23
+ resizeObserver.observe(viewport);
24
+ resizeObserver.observe(anchor);
25
+ resizeObserver.observe(target);
26
+ mutationObserver.observe(target, {
27
+ childList: true,
28
+ subtree: true,
29
+ characterData: true,
30
+ });
31
+ observedViewport = viewport;
32
+ observedAnchor = anchor;
33
+ observedTarget = target;
34
+ },
35
+ disconnect,
36
+ };
37
+ };
38
+ //# sourceMappingURL=createReserveObservers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReserveObservers.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAoB,EAAE,EAAE;IAC7D,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,gBAAgB,GAAuB,IAAI,CAAC;IAChD,IAAI,cAAc,GAAuB,IAAI,CAAC;IAC9C,IAAI,cAAc,GAAuB,IAAI,CAAC;IAE9C,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,cAAc,CAAC,UAAU,EAAE,CAAC;QAC5B,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAC9B,gBAAgB,GAAG,IAAI,CAAC;QACxB,cAAc,GAAG,IAAI,CAAC;QACtB,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,CACN,QAAqB,EACrB,MAAmB,EACnB,MAAmB,EACnB,EAAE;YACF,IACE,gBAAgB,KAAK,QAAQ;gBAC7B,cAAc,KAAK,MAAM;gBACzB,cAAc,KAAK,MAAM,EACzB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,UAAU,EAAE,CAAC;YAEb,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC/B,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,gBAAgB,GAAG,QAAQ,CAAC;YAC5B,cAAc,GAAG,MAAM,CAAC;YACxB,cAAc,GAAG,MAAM,CAAC;QAC1B,CAAC;QACD,UAAU;KACX,CAAC;AACJ,CAAC,CAAC"}