@assistant-ui/react 0.14.13 → 0.14.15

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 (214) hide show
  1. package/README.md +5 -1
  2. package/dist/client/ExternalThread.d.ts +2 -12
  3. package/dist/client/ExternalThread.d.ts.map +1 -1
  4. package/dist/client/ExternalThread.js +30 -29
  5. package/dist/client/ExternalThread.js.map +1 -1
  6. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  7. package/dist/client/InMemoryThreadList.js +24 -13
  8. package/dist/client/InMemoryThreadList.js.map +1 -1
  9. package/dist/client/SingleThreadList.d.ts.map +1 -1
  10. package/dist/client/SingleThreadList.js +12 -8
  11. package/dist/client/SingleThreadList.js.map +1 -1
  12. package/dist/context/providers/ThreadViewportProvider.js +1 -1
  13. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  14. package/dist/context/react/ThreadViewportContext.js +1 -1
  15. package/dist/context/react/utils/createContextHook.js +1 -1
  16. package/dist/context/react/utils/ensureBinding.js.map +1 -1
  17. package/dist/context/react/utils/useRuntimeState.js +1 -1
  18. package/dist/context/stores/ThreadViewport.js.map +1 -1
  19. package/dist/devtools/DevToolsHooks.js.map +1 -1
  20. package/dist/index.d.ts +4 -4
  21. package/dist/index.js +3 -3
  22. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -1
  23. package/dist/legacy-runtime/cloud/auiV0.js +1 -1
  24. package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
  25. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
  26. package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
  27. package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
  28. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
  29. package/dist/legacy-runtime/hooks/ThreadContext.js +1 -1
  30. package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
  31. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
  32. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +1 -1
  33. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +14 -0
  34. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  35. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +101 -0
  36. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +1 -0
  37. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +1 -1
  38. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  39. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +13 -2
  40. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  41. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +1 -1
  42. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +1 -1
  43. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  44. package/dist/mcp-apps/McpAppRenderer.js +7 -7
  45. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  46. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  47. package/dist/mcp-apps/McpAppsRemoteHost.js +5 -4
  48. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  49. package/dist/mcp-apps/app-frame.d.ts +1 -1
  50. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  51. package/dist/mcp-apps/app-frame.js +82 -104
  52. package/dist/mcp-apps/app-frame.js.map +1 -1
  53. package/dist/mcp-apps/bridge.d.ts +3 -3
  54. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  55. package/dist/mcp-apps/bridge.js +35 -10
  56. package/dist/mcp-apps/bridge.js.map +1 -1
  57. package/dist/mcp-apps/types.d.ts +2 -12
  58. package/dist/mcp-apps/types.d.ts.map +1 -1
  59. package/dist/mcp-apps/types.js.map +1 -1
  60. package/dist/model-context/frame/useAssistantFrameHost.js +1 -1
  61. package/dist/model-context/makeAssistantVisible.js +1 -1
  62. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  63. package/dist/primitives/actionBar/ActionBarCopy.js +1 -1
  64. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +1 -1
  65. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  66. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -1
  67. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -1
  68. package/dist/primitives/actionBar/ActionBarInteractionContext.js +1 -1
  69. package/dist/primitives/actionBar/ActionBarRoot.js +1 -1
  70. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +1 -1
  71. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +1 -1
  72. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +1 -1
  73. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +1 -1
  74. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +1 -1
  75. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +1 -1
  76. package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -1
  77. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
  78. package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -1
  79. package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -1
  80. package/dist/primitives/attachment/AttachmentRemove.js +1 -1
  81. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  82. package/dist/primitives/attachment/AttachmentRoot.js +1 -1
  83. package/dist/primitives/attachment/AttachmentThumb.js +1 -1
  84. package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -1
  85. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +1 -1
  86. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  87. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -1
  88. package/dist/primitives/composer/ComposerAddAttachment.js +1 -1
  89. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  90. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -1
  91. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  92. package/dist/primitives/composer/ComposerDictationTranscript.js +1 -1
  93. package/dist/primitives/composer/ComposerInput.js +1 -1
  94. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  95. package/dist/primitives/composer/ComposerInputPluginContext.js +1 -1
  96. package/dist/primitives/composer/ComposerQuote.js +1 -1
  97. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  98. package/dist/primitives/composer/ComposerRoot.js +1 -1
  99. package/dist/primitives/composer/ComposerSend.js +1 -1
  100. package/dist/primitives/composer/ComposerStopDictation.js +1 -1
  101. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  102. package/dist/primitives/composer/trigger/TriggerPopover.js +2 -2
  103. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  104. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -1
  105. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +1 -1
  106. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +1 -1
  107. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -1
  108. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +1 -1
  109. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  110. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +8 -7
  111. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  112. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +1 -1
  113. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  114. package/dist/primitives/composer/trigger/triggerDetectionResource.js +5 -4
  115. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  116. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  117. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +8 -7
  118. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  119. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  120. package/dist/primitives/composer/trigger/triggerNavigationResource.js +13 -12
  121. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  122. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  123. package/dist/primitives/composer/trigger/triggerSelectionResource.js +7 -6
  124. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  125. package/dist/primitives/error/ErrorMessage.js +1 -1
  126. package/dist/primitives/error/ErrorRoot.js +1 -1
  127. package/dist/primitives/message/MessagePartsGrouped.js +1 -1
  128. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  129. package/dist/primitives/message/MessageRoot.js +1 -1
  130. package/dist/primitives/message/MessageRoot.js.map +1 -1
  131. package/dist/primitives/messagePart/MessagePartImage.js +1 -1
  132. package/dist/primitives/messagePart/MessagePartText.js +1 -1
  133. package/dist/primitives/queueItem/QueueItemRemove.js +1 -1
  134. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  135. package/dist/primitives/queueItem/QueueItemSteer.js +1 -1
  136. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  137. package/dist/primitives/queueItem/QueueItemText.js +1 -1
  138. package/dist/primitives/reasoning/useScrollLock.js +1 -1
  139. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  140. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -1
  141. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  142. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +1 -1
  143. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  144. package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
  145. package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
  146. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -1
  147. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  148. package/dist/primitives/thread/ThreadRoot.js +1 -1
  149. package/dist/primitives/thread/ThreadScrollToBottom.js +1 -1
  150. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  151. package/dist/primitives/thread/ThreadViewport.js +1 -1
  152. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  153. package/dist/primitives/thread/ThreadViewportFooter.js +1 -1
  154. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  155. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  156. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -1
  157. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +1 -1
  158. package/dist/primitives/thread/useThreadViewportAutoScroll.js +1 -1
  159. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  160. package/dist/primitives/threadList/ThreadListNew.js +1 -1
  161. package/dist/primitives/threadList/ThreadListRoot.js +1 -1
  162. package/dist/primitives/threadListItem/ThreadListItemRoot.js +1 -1
  163. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -1
  164. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +1 -1
  165. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +1 -1
  166. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -1
  167. package/dist/sandbox-host/SandboxHost.d.ts +50 -0
  168. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -0
  169. package/dist/sandbox-host/SandboxHost.js +85 -0
  170. package/dist/sandbox-host/SandboxHost.js.map +1 -0
  171. package/dist/unstable/useMentionAdapter.d.ts +2 -2
  172. package/dist/unstable/useMentionAdapter.js +2 -2
  173. package/dist/unstable/useMentionAdapter.js.map +1 -1
  174. package/dist/unstable/useSlashCommandAdapter.js +1 -1
  175. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  176. package/dist/utils/Primitive.js +1 -1
  177. package/dist/utils/createActionButton.js +1 -1
  178. package/dist/utils/createActionButton.js.map +1 -1
  179. package/dist/utils/hooks/useManagedRef.js +1 -1
  180. package/dist/utils/hooks/useMediaQuery.js +1 -1
  181. package/dist/utils/hooks/useMediaQuery.js.map +1 -1
  182. package/dist/utils/hooks/useOnResizeContent.js +1 -1
  183. package/dist/utils/hooks/useOnScrollToBottom.js +1 -1
  184. package/dist/utils/hooks/useSizeHandle.js +1 -1
  185. package/dist/utils/json/is-json.js.map +1 -1
  186. package/dist/utils/smooth/SmoothContext.js +1 -1
  187. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  188. package/dist/utils/smooth/useSmooth.js +1 -1
  189. package/dist/utils/smooth/useSmooth.js.map +1 -1
  190. package/package.json +21 -20
  191. package/src/client/ExternalThread.ts +484 -515
  192. package/src/client/InMemoryThreadList.ts +154 -142
  193. package/src/client/SingleThreadList.ts +88 -81
  194. package/src/context/providers/ThreadViewportProvider.tsx +2 -2
  195. package/src/index.ts +18 -3
  196. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.test.ts +426 -0
  197. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.ts +146 -0
  198. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +16 -1
  199. package/src/mcp-apps/McpAppRenderer.tsx +28 -35
  200. package/src/mcp-apps/McpAppsRemoteHost.ts +25 -24
  201. package/src/mcp-apps/app-frame.tsx +100 -141
  202. package/src/mcp-apps/bridge.test.ts +100 -60
  203. package/src/mcp-apps/bridge.ts +43 -21
  204. package/src/mcp-apps/types.ts +2 -12
  205. package/src/primitives/composer/trigger/TriggerPopover.tsx +1 -1
  206. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +75 -76
  207. package/src/primitives/composer/trigger/triggerDetectionResource.ts +6 -5
  208. package/src/primitives/composer/trigger/triggerKeyboardResource.ts +9 -13
  209. package/src/primitives/composer/trigger/triggerNavigationResource.ts +14 -19
  210. package/src/primitives/composer/trigger/triggerSelectionResource.ts +8 -7
  211. package/src/sandbox-host/SandboxHost.test.tsx +231 -0
  212. package/src/sandbox-host/SandboxHost.tsx +185 -0
  213. package/src/tests/local-runtime-queue.test.tsx +305 -0
  214. package/src/unstable/useMentionAdapter.ts +2 -2
@@ -2,7 +2,7 @@
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useAui } from "@assistant-ui/store";
4
4
  import { useComposerAddAttachment } from "@assistant-ui/core/react";
5
- import { useCallback } from "react";
5
+ import { useCallback } from "@assistant-ui/tap/react-shim";
6
6
  //#region src/primitives/composer/ComposerAddAttachment.ts
7
7
  const useComposerAddAttachment$1 = ({ multiple = true } = {}) => {
8
8
  const { disabled, addAttachment } = useComposerAddAttachment();
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerAddAttachment.js","names":["useComposerAddAttachment","useComposerAddAttachmentBehavior"],"sources":["../../../src/primitives/composer/ComposerAddAttachment.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { useComposerAddAttachment as useComposerAddAttachmentBehavior } from \"@assistant-ui/core/react\";\n\nconst useComposerAddAttachment = ({\n multiple = true,\n}: {\n /** allow selecting multiple files */\n multiple?: boolean | undefined;\n} = {}) => {\n const { disabled, addAttachment } = useComposerAddAttachmentBehavior();\n const aui = useAui();\n\n const callback = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.multiple = multiple;\n input.hidden = true;\n\n const attachmentAccept = aui.composer().getState().attachmentAccept;\n if (attachmentAccept !== \"*\") {\n input.accept = attachmentAccept;\n }\n\n document.body.appendChild(input);\n\n input.onchange = (e) => {\n const fileList = (e.target as HTMLInputElement).files;\n if (!fileList) return;\n for (const file of fileList) {\n addAttachment(file);\n }\n\n document.body.removeChild(input);\n };\n\n input.oncancel = () => {\n if (!input.files || input.files.length === 0) {\n document.body.removeChild(input);\n }\n };\n\n input.click();\n }, [aui, multiple, addAttachment]);\n\n if (disabled) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveAddAttachment {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerAddAttachment>;\n}\n\nexport const ComposerPrimitiveAddAttachment = createActionButton(\n \"ComposerPrimitive.AddAttachment\",\n useComposerAddAttachment,\n [\"multiple\"],\n);\n"],"mappings":";;;;;;AAWA,MAAMA,8BAA4B,EAChC,WAAW,SAIT,CAAC,MAAM;CACT,MAAM,EAAE,UAAU,kBAAkBC,yBAAiC;CACrE,MAAM,MAAM,OAAO;CAEnB,MAAM,WAAW,kBAAkB;EACjC,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,OAAO;EACb,MAAM,WAAW;EACjB,MAAM,SAAS;EAEf,MAAM,mBAAmB,IAAI,SAAS,EAAE,SAAS,EAAE;EACnD,IAAI,qBAAqB,KACvB,MAAM,SAAS;EAGjB,SAAS,KAAK,YAAY,KAAK;EAE/B,MAAM,YAAY,MAAM;GACtB,MAAM,WAAY,EAAE,OAA4B;GAChD,IAAI,CAAC,UAAU;GACf,KAAK,MAAM,QAAQ,UACjB,cAAc,IAAI;GAGpB,SAAS,KAAK,YAAY,KAAK;EACjC;EAEA,MAAM,iBAAiB;GACrB,IAAI,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW,GACzC,SAAS,KAAK,YAAY,KAAK;EAEnC;EAEA,MAAM,MAAM;CACd,GAAG;EAAC;EAAK;EAAU;CAAa,CAAC;CAEjC,IAAI,UAAU,OAAO;CACrB,OAAO;AACT;AAOA,MAAa,iCAAiC,mBAC5C,mCACAD,4BACA,CAAC,UAAU,CACb"}
1
+ {"version":3,"file":"ComposerAddAttachment.js","names":["useComposerAddAttachment","useComposerAddAttachmentBehavior"],"sources":["../../../src/primitives/composer/ComposerAddAttachment.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { useComposerAddAttachment as useComposerAddAttachmentBehavior } from \"@assistant-ui/core/react\";\n\nconst useComposerAddAttachment = ({\n multiple = true,\n}: {\n /** allow selecting multiple files */\n multiple?: boolean | undefined;\n} = {}) => {\n const { disabled, addAttachment } = useComposerAddAttachmentBehavior();\n const aui = useAui();\n\n const callback = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.multiple = multiple;\n input.hidden = true;\n\n const attachmentAccept = aui.composer().getState().attachmentAccept;\n if (attachmentAccept !== \"*\") {\n input.accept = attachmentAccept;\n }\n\n document.body.appendChild(input);\n\n input.onchange = (e) => {\n const fileList = (e.target as HTMLInputElement).files;\n if (!fileList) return;\n for (const file of fileList) {\n addAttachment(file);\n }\n\n document.body.removeChild(input);\n };\n\n input.oncancel = () => {\n if (!input.files || input.files.length === 0) {\n document.body.removeChild(input);\n }\n };\n\n input.click();\n }, [aui, multiple, addAttachment]);\n\n if (disabled) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveAddAttachment {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerAddAttachment>;\n}\n\nexport const ComposerPrimitiveAddAttachment = createActionButton(\n \"ComposerPrimitive.AddAttachment\",\n useComposerAddAttachment,\n [\"multiple\"],\n);\n"],"mappings":";;;;;;AAWA,MAAMA,8BAA4B,EAChC,WAAW,SAIT,CAAC,MAAM;CACT,MAAM,EAAE,UAAU,kBAAkBC,yBAAiC;CACrE,MAAM,MAAM,OAAO;CAEnB,MAAM,WAAW,kBAAkB;EACjC,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,OAAO;EACb,MAAM,WAAW;EACjB,MAAM,SAAS;EAEf,MAAM,mBAAmB,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;EACnD,IAAI,qBAAqB,KACvB,MAAM,SAAS;EAGjB,SAAS,KAAK,YAAY,KAAK;EAE/B,MAAM,YAAY,MAAM;GACtB,MAAM,WAAY,EAAE,OAA4B;GAChD,IAAI,CAAC,UAAU;GACf,KAAK,MAAM,QAAQ,UACjB,cAAc,IAAI;GAGpB,SAAS,KAAK,YAAY,KAAK;EACjC;EAEA,MAAM,iBAAiB;GACrB,IAAI,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW,GACzC,SAAS,KAAK,YAAY,KAAK;EAEnC;EAEA,MAAM,MAAM;CACd,GAAG;EAAC;EAAK;EAAU;CAAa,CAAC;CAEjC,IAAI,UAAU,OAAO;CACrB,OAAO;AACT;AAOA,MAAa,iCAAiC,mBAC5C,mCACAD,4BACA,CAAC,UAAU,CACb"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useAui } from "@assistant-ui/store";
3
- import { cloneElement, forwardRef, isValidElement, useCallback, useState } from "react";
3
+ import { cloneElement, forwardRef, isValidElement, useCallback, useState } from "@assistant-ui/tap/react-shim";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { composeEventHandlers } from "@radix-ui/primitive";
6
6
  import { Slot } from "radix-ui";
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerAttachmentDropzone.js","names":[],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ReactElement,\n cloneElement,\n isValidElement,\n} from \"react\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Slot } from \"radix-ui\";\nimport type React from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveAttachmentDropzone {\n export type Element = HTMLDivElement;\n export type Props = React.HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean | undefined;\n render?: ReactElement | undefined;\n disabled?: boolean | undefined;\n };\n}\n\nexport const ComposerPrimitiveAttachmentDropzone = forwardRef<\n HTMLDivElement,\n ComposerPrimitiveAttachmentDropzone.Props\n>(({ disabled, asChild = false, render, children, ...rest }, ref) => {\n const [isDragging, setIsDragging] = useState(false);\n const aui = useAui();\n\n const handleDragEnterCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n },\n [disabled],\n );\n\n const handleDragOverCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!isDragging) setIsDragging(true);\n },\n [disabled, isDragging],\n );\n\n const handleDragLeaveCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) {\n return;\n }\n setIsDragging(false);\n },\n [disabled],\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(false);\n const files = Array.from(e.dataTransfer.files);\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer().addAttachment(file);\n } catch (error) {\n console.error(\"Failed to add attachment:\", error);\n }\n }),\n );\n },\n [disabled, aui],\n );\n\n const mergedProps = {\n ...(isDragging ? { \"data-dragging\": \"true\" } : null),\n ...rest,\n onDragEnterCapture: composeEventHandlers(\n rest.onDragEnterCapture,\n handleDragEnterCapture,\n ),\n onDragOverCapture: composeEventHandlers(\n rest.onDragOverCapture,\n handleDragOverCapture,\n ),\n onDragLeaveCapture: composeEventHandlers(\n rest.onDragLeaveCapture,\n handleDragLeaveCapture,\n ),\n onDropCapture: composeEventHandlers(rest.onDropCapture, handleDrop),\n ref,\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n children !== undefined\n ? children\n : (render.props as Record<string, unknown>).children;\n return (\n <Slot.Root {...mergedProps}>\n {cloneElement(render, undefined, renderChildren as React.ReactNode)}\n </Slot.Root>\n );\n }\n\n const Comp = asChild ? Slot.Root : \"div\";\n return <Comp {...mergedProps}>{children}</Comp>;\n});\n\nComposerPrimitiveAttachmentDropzone.displayName =\n \"ComposerPrimitive.AttachmentDropzone\";\n"],"mappings":";;;;;;;AAyBA,MAAa,sCAAsC,YAGhD,EAAE,UAAU,UAAU,OAAO,QAAQ,UAAU,GAAG,QAAQ,QAAQ;CACnE,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,MAAM,OAAO;CAEnB,MAAM,yBAAyB,aAC5B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,cAAc,IAAI;CACpB,GACA,CAAC,QAAQ,CACX;CAEA,MAAM,wBAAwB,aAC3B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,IAAI,CAAC,YAAY,cAAc,IAAI;CACrC,GACA,CAAC,UAAU,UAAU,CACvB;CAEA,MAAM,yBAAyB,aAC5B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,MAAM,OAAO,EAAE;EACf,IAAI,QAAQ,EAAE,cAAc,SAAS,IAAI,GACvC;EAEF,cAAc,KAAK;CACrB,GACA,CAAC,QAAQ,CACX;CAEA,MAAM,aAAa,YACjB,OAAO,MAAuB;EAC5B,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,cAAc,KAAK;EACnB,MAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;EAC7C,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;GACxB,IAAI;IACF,MAAM,IAAI,SAAS,EAAE,cAAc,IAAI;GACzC,SAAS,OAAO;IACd,QAAQ,MAAM,6BAA6B,KAAK;GAClD;EACF,CAAC,CACH;CACF,GACA,CAAC,UAAU,GAAG,CAChB;CAEA,MAAM,cAAc;EAClB,GAAI,aAAa,EAAE,iBAAiB,OAAO,IAAI;EAC/C,GAAG;EACH,oBAAoB,qBAClB,KAAK,oBACL,sBACF;EACA,mBAAmB,qBACjB,KAAK,mBACL,qBACF;EACA,oBAAoB,qBAClB,KAAK,oBACL,sBACF;EACA,eAAe,qBAAqB,KAAK,eAAe,UAAU;EAClE;CACF;CAEA,IAAI,UAAU,eAAe,MAAM,GAAG;EACpC,MAAM,iBACJ,aAAa,KAAA,IACT,WACC,OAAO,MAAkC;EAChD,OACE,oBAAC,KAAK,MAAN;GAAW,GAAI;aACZ,aAAa,QAAQ,KAAA,GAAW,cAAiC;EACzD,CAAA;CAEf;CAGA,OAAO,oBADM,UAAU,KAAK,OAAO,OAC5B;EAAM,GAAI;EAAc;CAAe,CAAA;AAChD,CAAC;AAED,oCAAoC,cAClC"}
1
+ {"version":3,"file":"ComposerAttachmentDropzone.js","names":[],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ReactElement,\n cloneElement,\n isValidElement,\n} from \"react\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Slot } from \"radix-ui\";\nimport type React from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveAttachmentDropzone {\n export type Element = HTMLDivElement;\n export type Props = React.HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean | undefined;\n render?: ReactElement | undefined;\n disabled?: boolean | undefined;\n };\n}\n\nexport const ComposerPrimitiveAttachmentDropzone = forwardRef<\n HTMLDivElement,\n ComposerPrimitiveAttachmentDropzone.Props\n>(({ disabled, asChild = false, render, children, ...rest }, ref) => {\n const [isDragging, setIsDragging] = useState(false);\n const aui = useAui();\n\n const handleDragEnterCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n },\n [disabled],\n );\n\n const handleDragOverCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!isDragging) setIsDragging(true);\n },\n [disabled, isDragging],\n );\n\n const handleDragLeaveCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) {\n return;\n }\n setIsDragging(false);\n },\n [disabled],\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(false);\n const files = Array.from(e.dataTransfer.files);\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer().addAttachment(file);\n } catch (error) {\n console.error(\"Failed to add attachment:\", error);\n }\n }),\n );\n },\n [disabled, aui],\n );\n\n const mergedProps = {\n ...(isDragging ? { \"data-dragging\": \"true\" } : null),\n ...rest,\n onDragEnterCapture: composeEventHandlers(\n rest.onDragEnterCapture,\n handleDragEnterCapture,\n ),\n onDragOverCapture: composeEventHandlers(\n rest.onDragOverCapture,\n handleDragOverCapture,\n ),\n onDragLeaveCapture: composeEventHandlers(\n rest.onDragLeaveCapture,\n handleDragLeaveCapture,\n ),\n onDropCapture: composeEventHandlers(rest.onDropCapture, handleDrop),\n ref,\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n children !== undefined\n ? children\n : (render.props as Record<string, unknown>).children;\n return (\n <Slot.Root {...mergedProps}>\n {cloneElement(render, undefined, renderChildren as React.ReactNode)}\n </Slot.Root>\n );\n }\n\n const Comp = asChild ? Slot.Root : \"div\";\n return <Comp {...mergedProps}>{children}</Comp>;\n});\n\nComposerPrimitiveAttachmentDropzone.displayName =\n \"ComposerPrimitive.AttachmentDropzone\";\n"],"mappings":";;;;;;;AAyBA,MAAa,sCAAsC,YAGhD,EAAE,UAAU,UAAU,OAAO,QAAQ,UAAU,GAAG,QAAQ,QAAQ;CACnE,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,MAAM,OAAO;CAEnB,MAAM,yBAAyB,aAC5B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,cAAc,IAAI;CACpB,GACA,CAAC,QAAQ,CACX;CAEA,MAAM,wBAAwB,aAC3B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,IAAI,CAAC,YAAY,cAAc,IAAI;CACrC,GACA,CAAC,UAAU,UAAU,CACvB;CAEA,MAAM,yBAAyB,aAC5B,MAAuB;EACtB,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,MAAM,OAAO,EAAE;EACf,IAAI,QAAQ,EAAE,cAAc,SAAS,IAAI,GACvC;EAEF,cAAc,KAAK;CACrB,GACA,CAAC,QAAQ,CACX;CAEA,MAAM,aAAa,YACjB,OAAO,MAAuB;EAC5B,IAAI,UAAU;EACd,EAAE,eAAe;EACjB,cAAc,KAAK;EACnB,MAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;EAC7C,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;GACxB,IAAI;IACF,MAAM,IAAI,SAAS,CAAC,CAAC,cAAc,IAAI;GACzC,SAAS,OAAO;IACd,QAAQ,MAAM,6BAA6B,KAAK;GAClD;EACF,CAAC,CACH;CACF,GACA,CAAC,UAAU,GAAG,CAChB;CAEA,MAAM,cAAc;EAClB,GAAI,aAAa,EAAE,iBAAiB,OAAO,IAAI;EAC/C,GAAG;EACH,oBAAoB,qBAClB,KAAK,oBACL,sBACF;EACA,mBAAmB,qBACjB,KAAK,mBACL,qBACF;EACA,oBAAoB,qBAClB,KAAK,oBACL,sBACF;EACA,eAAe,qBAAqB,KAAK,eAAe,UAAU;EAClE;CACF;CAEA,IAAI,UAAU,eAAe,MAAM,GAAG;EACpC,MAAM,iBACJ,aAAa,KAAA,IACT,WACC,OAAO,MAAkC;EAChD,OACE,oBAAC,KAAK,MAAN;GAAW,GAAI;aACZ,aAAa,QAAQ,KAAA,GAAW,cAAiC;EACzD,CAAA;CAEf;CAGA,OAAO,oBADM,UAAU,KAAK,OAAO,OAC5B;EAAM,GAAI;EAAc;CAAe,CAAA;AAChD,CAAC;AAED,oCAAoC,cAClC"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { useAuiState } from "@assistant-ui/store";
4
- import { forwardRef } from "react";
4
+ import { forwardRef } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/primitives/composer/ComposerDictationTranscript.tsx
7
7
  /**
@@ -4,7 +4,7 @@ import { useMediaQuery } from "../../utils/hooks/useMediaQuery.js";
4
4
  import { useComposerInputPluginRegistryOptional } from "./ComposerInputPluginContext.js";
5
5
  import { useTriggerPopoverActiveAriaOptional } from "./trigger/TriggerPopoverRootContext.js";
6
6
  import { useAui, useAuiState } from "@assistant-ui/store";
7
- import { cloneElement, forwardRef, isValidElement, useCallback, useEffect, useRef } from "react";
7
+ import { cloneElement, forwardRef, isValidElement, useCallback, useEffect, useRef } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
10
10
  import { composeEventHandlers } from "@radix-ui/primitive";
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerInput.js","names":[],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\nimport { flushResourcesSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useTriggerPopoverActiveAriaOptional } from \"./trigger/TriggerPopoverRootContext\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const activeAria = useTriggerPopoverActiveAriaOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useAuiState((s) => {\n if (!s.composer.isEditing) return \"\";\n return s.composer.text;\n });\n\n const isDisabled =\n useAuiState(\n (s) => s.thread.isDisabled || s.composer.dictation?.inputDisabled,\n ) || disabledProp;\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer();\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread().getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer().getState().canSend\n ) {\n e.preventDefault();\n aui.composer().send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread().getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n try {\n e.preventDefault();\n await Promise.all(\n files.map((file) => aui.composer().addAttachment(file)),\n );\n } catch (error) {\n console.error(\"Error adding attachment:\", error);\n }\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer().getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer().getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer().getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threadListItem.switchedTo\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n const ariaComboboxProps = activeAria\n ? {\n \"aria-controls\": activeAria.popoverId,\n \"aria-expanded\": true as const,\n \"aria-haspopup\": \"listbox\" as const,\n \"aria-activedescendant\": activeAria.highlightedItemId,\n }\n : {};\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer().getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushResourcesSync(() => {\n aui.composer().setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer().getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushResourcesSync(() => {\n aui.composer().setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ComposerInput.js","names":[],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\nimport { flushResourcesSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useTriggerPopoverActiveAriaOptional } from \"./trigger/TriggerPopoverRootContext\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const activeAria = useTriggerPopoverActiveAriaOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useAuiState((s) => {\n if (!s.composer.isEditing) return \"\";\n return s.composer.text;\n });\n\n const isDisabled =\n useAuiState(\n (s) => s.thread.isDisabled || s.composer.dictation?.inputDisabled,\n ) || disabledProp;\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer();\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread().getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer().getState().canSend\n ) {\n e.preventDefault();\n aui.composer().send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread().getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n try {\n e.preventDefault();\n await Promise.all(\n files.map((file) => aui.composer().addAttachment(file)),\n );\n } catch (error) {\n console.error(\"Error adding attachment:\", error);\n }\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer().getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer().getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer().getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threadListItem.switchedTo\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n const ariaComboboxProps = activeAria\n ? {\n \"aria-controls\": activeAria.popoverId,\n \"aria-expanded\": true as const,\n \"aria-haspopup\": \"listbox\" as const,\n \"aria-activedescendant\": activeAria.highlightedItemId,\n }\n : {};\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer().getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushResourcesSync(() => {\n aui.composer().setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer().getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushResourcesSync(() => {\n aui.composer().setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":";;;;;;;;;;;;;;;AA4BA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiH5B,MAAa,yBAAyB,YAKlC,EACE,YAAY,OACZ,SACA,QACA,UAAU,cACV,UACA,WACA,SACA,UACA,eACA,YACA,iBAAiB,MACjB,2BAA2B,MAC3B,iCAAiC,MACjC,iCAAiC,MACjC,qCAAqC,OACrC,uBAAuB,MACvB,GAAG,QAEL,iBACG;CACH,MAAM,MAAM,OAAO;CACnB,MAAM,iBAAiB,uCAAuC;CAC9D,MAAM,aAAa,oCAAoC;CAEvD,MAAM,qBACJ,eAAe,kBAAkB,QAAQ,SAAS;CACpD,MAAM,iBAAiB,cACrB,qCAAqC,sBAAsB,IAC7D;CACA,MAAM,sBACJ,sCACA,kBACA,uBAAuB,UACnB,SACA;CAEN,MAAM,QAAQ,aAAa,MAAM;EAC/B,IAAI,CAAC,EAAE,SAAS,WAAW,OAAO;EAClC,OAAO,EAAE,SAAS;CACpB,CAAC;CAED,MAAM,aACJ,aACG,MAAM,EAAE,OAAO,cAAc,EAAE,SAAS,WAAW,aACtD,KAAK;CACP,MAAM,cAAc,OAA4B,IAAI;CACpD,MAAM,MAAM,gBAAgB,cAAc,WAAW;CAErD,MAAM,iBAAiB,OAAO,KAAK;CAEnC,kBAAkB,MAAM;EAEtB,IAAI,CAAC,YAAY,SAAS,SAAS,EAAE,MAAc,GAAG;EAGtD,IAAI;QACG,MAAM,UAAU,eAAe,WAAW,GAC7C,IAAI,OAAO,cAAc,CAAC,GAAG;EAAA;EAIjC,IAAI,CAAC,gBAAgB;EAErB,MAAM,WAAW,IAAI,SAAS;EAC9B,IAAI,SAAS,SAAS,CAAC,CAAC,WAAW;GACjC,SAAS,OAAO;GAChB,EAAE,eAAe;EACnB;CACF,CAAC;CAED,MAAM,kBAAkB,MAAqB;EAC3C,IAAI,YAAY;EAGhB,IAAI,EAAE,YAAY,aAAa;EAG/B,IAAI;QACG,MAAM,UAAU,eAAe,WAAW,GAC7C,IAAI,OAAO,cAAc,CAAC,GAAG;EAAA;EAIjC,IAAI,EAAE,QAAQ,SAAS;GACrB,MAAM,cAAc,IAAI,OAAO,CAAC,CAAC,SAAS;GAC1C,MAAM,WAAW,YAAY,aAAa;GAG1C,IACE,EAAE,aACD,EAAE,WAAW,EAAE,YAChB,YACA,uBAAuB,UACvB,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAC1B;IACA,EAAE,eAAe;IACjB,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IACnC;GACF;GAGA,IAAI,EAAE,UAAU;GAGhB,IAAI,YAAY,aAAa,CAAC,UAAU;GAExC,IAAI,eAAe;GACnB,IAAI,wBAAwB,aAC1B,eAAe,EAAE,WAAW,EAAE;QACzB,IAAI,wBAAwB,SACjC,eAAe;GAGjB,IAAI,cAAc;IAChB,EAAE,eAAe;IACjB,YAAY,SAAS,QAAQ,MAAM,CAAC,EAAE,cAAc;GACtD;EACF;CACF;CAEA,MAAM,cAAc,OAAO,MAA2C;EACpE,IAAI,CAAC,sBAAsB;EAC3B,MAAM,qBAAqB,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;EACnD,MAAM,QAAQ,MAAM,KAAK,EAAE,eAAe,SAAS,CAAC,CAAC;EAErD,IAAI,mBAAmB,eAAe,MAAM,SAAS,GACnD,IAAI;GACF,EAAE,eAAe;GACjB,MAAM,QAAQ,IACZ,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,cAAc,IAAI,CAAC,CACxD;EACF,SAAS,OAAO;GACd,QAAQ,MAAM,4BAA4B,KAAK;EACjD;CAEJ;CAEA,MAAM,mBAAmB,aAAa,CAAC;CACvC,MAAM,QAAQ,kBAAkB;EAC9B,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,YAAY,CAAC,kBAAkB;EAEpC,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;EACtC,SAAS,kBAAkB,SAAS,MAAM,QAAQ,SAAS,MAAM,MAAM;CACzE,GAAG,CAAC,gBAAgB,CAAC;CAErB,gBAAgB,MAAM,GAAG,CAAC,KAAK,CAAC;CAEhC,0BAA0B;EACxB,IACE,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,YACnC,gCAEA,MAAM;CAEV,CAAC;CAED,gBAAgB;EACd,IACE,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,YACnC,CAAC,0BAED,OAAO,KAAA;EAET,OAAO,IAAI,GAAG,mBAAmB,KAAK;CACxC,GAAG;EAAC;EAA0B;EAAO;CAAG,CAAC;CAEzC,gBAAgB;EACd,IACE,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,YACnC,CAAC,gCAED,OAAO,KAAA;EAET,OAAO,IAAI,GAAG,6BAA6B,KAAK;CAClD,GAAG;EAAC;EAAgC;EAAO;CAAG,CAAC;CAE/C,MAAM,oBAAoB,aACtB;EACE,iBAAiB,WAAW;EAC5B,iBAAiB;EACjB,iBAAiB;EACjB,yBAAyB,WAAW;CACtC,IACA,CAAC;CAEL,MAAM,aAAa;EACjB,MAAM;EACN;EACA,GAAG;EACH,GAAG;EACE;EACL,UAAU;EACV,UAAU,qBACR,WACC,MAA8C;GAC7C,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW;GAC1C,MAAM,oBACH,EAAE,YAA0C,gBAAgB;GAE/D,IAAI,eAAe,WAAW,CAAC,mBAC7B,eAAe,UAAU;GAE3B,MAAM,cAAc,qBAAqB,eAAe;GAExD,yBAAyB;IACvB,IAAI,SAAS,CAAC,CAAC,QAAQ,EAAE,OAAO,KAAK;GACvC,CAAC;GACD,IAAI,aAAa;GACjB,MAAM,MAAM,EAAE,OAAO,kBAAkB,EAAE,OAAO,MAAM;GACtD,IAAI,gBACF,KAAK,MAAM,UAAU,eAAe,WAAW,GAC7C,OAAO,kBAAkB,GAAG;EAGlC,CACF;EACA,WAAW,qBAAqB,WAAW,cAAc;EACzD,oBAAoB,qBACjB,KACE,0BACG;GACJ,eAAe,UAAU;EAC3B,CACF;EACA,kBAAkB,qBACf,KACE,mBACF,MAAmD;GAClD,eAAe,UAAU;GACzB,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW;GAC1C,MAAM,SAAS,EAAE;GACjB,yBAAyB;IACvB,IAAI,SAAS,CAAC,CAAC,QAAQ,OAAO,KAAK;GACrC,CAAC;GACD,MAAM,MAAM,OAAO,kBAAkB,OAAO,MAAM;GAClD,IAAI,gBACF,KAAK,MAAM,UAAU,eAAe,WAAW,GAC7C,OAAO,kBAAkB,GAAG;EAGlC,CACF;EACA,UAAU,qBACR,WACC,MAAiD;GAChD,IAAI,eAAe,SAAS;GAC5B,MAAM,SAAS,EAAE;GACjB,MAAM,MAAM,OAAO,kBAAkB,OAAO,MAAM;GAClD,IAAI,gBACF,KAAK,MAAM,UAAU,eAAe,WAAW,GAC7C,OAAO,kBAAkB,GAAG;EAGlC,CACF;EACA,SAAS,qBAAqB,SAAS,WAAW;CACpD;CAEA,IAAI,UAAU,eAAe,MAAM,GAAG;EACpC,MAAM,iBACH,KAAa,aAAa,KAAA,IACrB,KAAa,WACb,OAAO,MAAkC;EACjD,OACE,oBAAC,KAAK,MAAN;GAAW,GAAI;aACZ,aAAa,QAAQ,KAAA,GAAW,cAAc;EACtC,CAAA;CAEf;CAGA,OAAO,oBADW,UAAU,KAAK,OAAO,kBACjC,EAAW,GAAI,WAAa,CAAA;AACrC,CACF;AAEA,uBAAuB,cAAc"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { createContext, useCallback, useContext, useMemo, useRef } from "react";
2
+ import { createContext, useCallback, useContext, useMemo, useRef } from "@assistant-ui/tap/react-shim";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/primitives/composer/ComposerInputPluginContext.tsx
5
5
  const ComposerInputPluginRegistryContext = createContext(null);
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { useAui, useAuiState } from "@assistant-ui/store";
4
- import { forwardRef, useCallback } from "react";
4
+ import { forwardRef, useCallback } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  //#region src/primitives/composer/ComposerQuote.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerQuote.js","names":[],"sources":["../../../src/primitives/composer/ComposerQuote.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n type ComponentPropsWithoutRef,\n forwardRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// ---- Root ----\n\nexport namespace ComposerPrimitiveQuote {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * Renders a container for the quoted text preview in the composer.\n * Only renders when a quote is set.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Quote>\n * <ComposerPrimitive.QuoteText />\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * </ComposerPrimitive.Quote>\n * ```\n */\nexport const ComposerPrimitiveQuote = forwardRef<\n ComposerPrimitiveQuote.Element,\n ComposerPrimitiveQuote.Props\n>((props, forwardedRef) => {\n const quote = useAuiState((s) => s.composer.quote);\n if (!quote) return null;\n\n return <Primitive.div {...props} ref={forwardedRef} />;\n});\n\nComposerPrimitiveQuote.displayName = \"ComposerPrimitive.Quote\";\n\n// ---- QuoteText ----\n\nexport namespace ComposerPrimitiveQuoteText {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the quoted text content.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteText />\n * ```\n */\nexport const ComposerPrimitiveQuoteText = forwardRef<\n ComposerPrimitiveQuoteText.Element,\n ComposerPrimitiveQuoteText.Props\n>(({ children, ...props }, forwardedRef) => {\n const text = useAuiState((s) => s.composer.quote?.text);\n if (!text) return null;\n\n return (\n <Primitive.span {...props} ref={forwardedRef}>\n {children ?? text}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveQuoteText.displayName = \"ComposerPrimitive.QuoteText\";\n\n// ---- QuoteDismiss ----\n\nexport namespace ComposerPrimitiveQuoteDismiss {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\n/**\n * A button that clears the current quote from the composer.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * ```\n */\nexport const ComposerPrimitiveQuoteDismiss = forwardRef<\n ComposerPrimitiveQuoteDismiss.Element,\n ComposerPrimitiveQuoteDismiss.Props\n>(({ onClick, ...props }, forwardedRef) => {\n const aui = useAui();\n const handleDismiss = useCallback(() => {\n aui.composer().setQuote(undefined);\n }, [aui]);\n\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(onClick, handleDismiss)}\n />\n );\n});\n\nComposerPrimitiveQuoteDismiss.displayName = \"ComposerPrimitive.QuoteDismiss\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA,MAAa,yBAAyB,YAGnC,OAAO,iBAAiB;CAEzB,IAAI,CADU,aAAa,MAAM,EAAE,SAAS,KACnC,GAAG,OAAO;CAEnB,OAAO,oBAAC,UAAU,KAAX;EAAe,GAAI;EAAO,KAAK;CAAe,CAAA;AACvD,CAAC;AAED,uBAAuB,cAAc;;;;;;;;;AAiBrC,MAAa,6BAA6B,YAGvC,EAAE,UAAU,GAAG,SAAS,iBAAiB;CAC1C,MAAM,OAAO,aAAa,MAAM,EAAE,SAAS,OAAO,IAAI;CACtD,IAAI,CAAC,MAAM,OAAO;CAElB,OACE,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAO,KAAK;YAC7B,YAAY;CACC,CAAA;AAEpB,CAAC;AAED,2BAA2B,cAAc;;;;;;;;;AAiBzC,MAAa,gCAAgC,YAG1C,EAAE,SAAS,GAAG,SAAS,iBAAiB;CACzC,MAAM,MAAM,OAAO;CACnB,MAAM,gBAAgB,kBAAkB;EACtC,IAAI,SAAS,EAAE,SAAS,KAAA,CAAS;CACnC,GAAG,CAAC,GAAG,CAAC;CAER,OACE,oBAAC,UAAU,QAAX;EACE,MAAK;EACL,GAAI;EACJ,KAAK;EACL,SAAS,qBAAqB,SAAS,aAAa;CACrD,CAAA;AAEL,CAAC;AAED,8BAA8B,cAAc"}
1
+ {"version":3,"file":"ComposerQuote.js","names":[],"sources":["../../../src/primitives/composer/ComposerQuote.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n type ComponentPropsWithoutRef,\n forwardRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\n\n// ---- Root ----\n\nexport namespace ComposerPrimitiveQuote {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * Renders a container for the quoted text preview in the composer.\n * Only renders when a quote is set.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Quote>\n * <ComposerPrimitive.QuoteText />\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * </ComposerPrimitive.Quote>\n * ```\n */\nexport const ComposerPrimitiveQuote = forwardRef<\n ComposerPrimitiveQuote.Element,\n ComposerPrimitiveQuote.Props\n>((props, forwardedRef) => {\n const quote = useAuiState((s) => s.composer.quote);\n if (!quote) return null;\n\n return <Primitive.div {...props} ref={forwardedRef} />;\n});\n\nComposerPrimitiveQuote.displayName = \"ComposerPrimitive.Quote\";\n\n// ---- QuoteText ----\n\nexport namespace ComposerPrimitiveQuoteText {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the quoted text content.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteText />\n * ```\n */\nexport const ComposerPrimitiveQuoteText = forwardRef<\n ComposerPrimitiveQuoteText.Element,\n ComposerPrimitiveQuoteText.Props\n>(({ children, ...props }, forwardedRef) => {\n const text = useAuiState((s) => s.composer.quote?.text);\n if (!text) return null;\n\n return (\n <Primitive.span {...props} ref={forwardedRef}>\n {children ?? text}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveQuoteText.displayName = \"ComposerPrimitive.QuoteText\";\n\n// ---- QuoteDismiss ----\n\nexport namespace ComposerPrimitiveQuoteDismiss {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\n/**\n * A button that clears the current quote from the composer.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.QuoteDismiss>×</ComposerPrimitive.QuoteDismiss>\n * ```\n */\nexport const ComposerPrimitiveQuoteDismiss = forwardRef<\n ComposerPrimitiveQuoteDismiss.Element,\n ComposerPrimitiveQuoteDismiss.Props\n>(({ onClick, ...props }, forwardedRef) => {\n const aui = useAui();\n const handleDismiss = useCallback(() => {\n aui.composer().setQuote(undefined);\n }, [aui]);\n\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(onClick, handleDismiss)}\n />\n );\n});\n\nComposerPrimitiveQuoteDismiss.displayName = \"ComposerPrimitive.QuoteDismiss\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA,MAAa,yBAAyB,YAGnC,OAAO,iBAAiB;CAEzB,IAAI,CADU,aAAa,MAAM,EAAE,SAAS,KACnC,GAAG,OAAO;CAEnB,OAAO,oBAAC,UAAU,KAAX;EAAe,GAAI;EAAO,KAAK;CAAe,CAAA;AACvD,CAAC;AAED,uBAAuB,cAAc;;;;;;;;;AAiBrC,MAAa,6BAA6B,YAGvC,EAAE,UAAU,GAAG,SAAS,iBAAiB;CAC1C,MAAM,OAAO,aAAa,MAAM,EAAE,SAAS,OAAO,IAAI;CACtD,IAAI,CAAC,MAAM,OAAO;CAElB,OACE,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAO,KAAK;YAC7B,YAAY;CACC,CAAA;AAEpB,CAAC;AAED,2BAA2B,cAAc;;;;;;;;;AAiBzC,MAAa,gCAAgC,YAG1C,EAAE,SAAS,GAAG,SAAS,iBAAiB;CACzC,MAAM,MAAM,OAAO;CACnB,MAAM,gBAAgB,kBAAkB;EACtC,IAAI,SAAS,CAAC,CAAC,SAAS,KAAA,CAAS;CACnC,GAAG,CAAC,GAAG,CAAC;CAER,OACE,oBAAC,UAAU,QAAX;EACE,MAAK;EACL,GAAI;EACJ,KAAK;EACL,SAAS,qBAAqB,SAAS,aAAa;CACrD,CAAA;AAEL,CAAC;AAED,8BAA8B,cAAc"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
3
  import { useComposerSend } from "./ComposerSend.js";
4
- import { forwardRef } from "react";
4
+ import { forwardRef } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  //#region src/primitives/composer/ComposerRoot.tsx
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useComposerSend as useComposerSend$1 } from "@assistant-ui/core/react";
4
- import { useCallback } from "react";
4
+ import { useCallback } from "@assistant-ui/tap/react-shim";
5
5
  //#region src/primitives/composer/ComposerSend.ts
6
6
  const useComposerSend = () => {
7
7
  const { disabled, send } = useComposerSend$1();
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useAui, useAuiState } from "@assistant-ui/store";
4
- import { useCallback } from "react";
4
+ import { useCallback } from "@assistant-ui/tap/react-shim";
5
5
  //#region src/primitives/composer/ComposerStopDictation.ts
6
6
  const useComposerStopDictation = () => {
7
7
  const aui = useAui();
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerStopDictation.js","names":[],"sources":["../../../src/primitives/composer/ComposerStopDictation.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n ActionButtonElement,\n ActionButtonProps,\n} from \"../../utils/createActionButton\";\nimport { createActionButton } from \"../../utils/createActionButton\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst useComposerStopDictation = () => {\n const aui = useAui();\n const isDictating = useAuiState((s) => s.composer.dictation != null);\n\n const callback = useCallback(() => {\n aui.composer().stopDictation();\n }, [aui]);\n\n if (!isDictating) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveStopDictation {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerStopDictation>;\n}\n\n/**\n * A button that stops the current dictation session.\n *\n * Only rendered when dictation is active.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.StopDictation>\n * <StopIcon />\n * </ComposerPrimitive.StopDictation>\n * ```\n */\nexport const ComposerPrimitiveStopDictation = createActionButton(\n \"ComposerPrimitive.StopDictation\",\n useComposerStopDictation,\n);\n"],"mappings":";;;;;AAWA,MAAM,iCAAiC;CACrC,MAAM,MAAM,OAAO;CACnB,MAAM,cAAc,aAAa,MAAM,EAAE,SAAS,aAAa,IAAI;CAEnE,MAAM,WAAW,kBAAkB;EACjC,IAAI,SAAS,EAAE,cAAc;CAC/B,GAAG,CAAC,GAAG,CAAC;CAER,IAAI,CAAC,aAAa,OAAO;CACzB,OAAO;AACT;;;;;;;;;;;;;AAmBA,MAAa,iCAAiC,mBAC5C,mCACA,wBACF"}
1
+ {"version":3,"file":"ComposerStopDictation.js","names":[],"sources":["../../../src/primitives/composer/ComposerStopDictation.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n ActionButtonElement,\n ActionButtonProps,\n} from \"../../utils/createActionButton\";\nimport { createActionButton } from \"../../utils/createActionButton\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst useComposerStopDictation = () => {\n const aui = useAui();\n const isDictating = useAuiState((s) => s.composer.dictation != null);\n\n const callback = useCallback(() => {\n aui.composer().stopDictation();\n }, [aui]);\n\n if (!isDictating) return null;\n return callback;\n};\n\nexport namespace ComposerPrimitiveStopDictation {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useComposerStopDictation>;\n}\n\n/**\n * A button that stops the current dictation session.\n *\n * Only rendered when dictation is active.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.StopDictation>\n * <StopIcon />\n * </ComposerPrimitive.StopDictation>\n * ```\n */\nexport const ComposerPrimitiveStopDictation = createActionButton(\n \"ComposerPrimitive.StopDictation\",\n useComposerStopDictation,\n);\n"],"mappings":";;;;;AAWA,MAAM,iCAAiC;CACrC,MAAM,MAAM,OAAO;CACnB,MAAM,cAAc,aAAa,MAAM,EAAE,SAAS,aAAa,IAAI;CAEnE,MAAM,WAAW,kBAAkB;EACjC,IAAI,SAAS,CAAC,CAAC,cAAc;CAC/B,GAAG,CAAC,GAAG,CAAC;CAER,IAAI,CAAC,aAAa,OAAO;CACzB,OAAO;AACT;;;;;;;;;;;;;AAmBA,MAAa,iCAAiC,mBAC5C,mCACA,wBACF"}
@@ -4,9 +4,9 @@ import { useComposerInputPluginRegistryOptional } from "../ComposerInputPluginCo
4
4
  import { useTriggerPopoverAriaPublish, useTriggerPopoverRootContext } from "./TriggerPopoverRootContext.js";
5
5
  import { TriggerPopoverResource } from "./TriggerPopoverResource.js";
6
6
  import { useAui, useAuiState } from "@assistant-ui/store";
7
- import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
7
+ import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx } from "react/jsx-runtime";
9
- import { useResource } from "@assistant-ui/tap/react";
9
+ import { useResource } from "@assistant-ui/tap";
10
10
  //#region src/primitives/composer/trigger/TriggerPopover.tsx
11
11
  const TriggerPopoverScopeContext = createContext(null);
12
12
  const useTriggerPopoverScopeContext = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPopover.js","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport type { Unstable_TriggerAdapter } from \"@assistant-ui/core\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ComponentRef,\n} from \"react\";\nimport { Primitive } from \"../../../utils/Primitive\";\nimport { useComposerInputPluginRegistryOptional } from \"../ComposerInputPluginContext\";\nimport {\n TriggerPopoverResource,\n type TriggerPopoverResourceOutput,\n} from \"./TriggerPopoverResource\";\nimport type { TriggerBehavior } from \"./triggerSelectionResource\";\nimport {\n useTriggerPopoverAriaPublish,\n useTriggerPopoverRootContext,\n} from \"./TriggerPopoverRootContext\";\n\nconst TriggerPopoverScopeContext =\n createContext<TriggerPopoverResourceOutput | null>(null);\n\nexport const useTriggerPopoverScopeContext = () => {\n const ctx = useContext(TriggerPopoverScopeContext);\n if (!ctx)\n throw new Error(\n \"useTriggerPopoverScopeContext must be used within ComposerPrimitive.TriggerPopover\",\n );\n return ctx;\n};\n\nexport const useTriggerPopoverScopeContextOptional = () =>\n useContext(TriggerPopoverScopeContext);\n\n/** Registration API exposed to behavior sub-primitives. */\nexport type TriggerBehaviorRegistration = {\n register(behavior: TriggerBehavior): () => void;\n};\n\nconst TriggerBehaviorRegistrationContext =\n createContext<TriggerBehaviorRegistration | null>(null);\n\n/** Obtain the registration handle from the parent `<TriggerPopover>`. */\nexport const useTriggerBehaviorRegistration = () => {\n const ctx = useContext(TriggerBehaviorRegistrationContext);\n if (!ctx)\n throw new Error(\n \"TriggerPopover.Directive / TriggerPopover.Action must be rendered inside ComposerPrimitive.TriggerPopover\",\n );\n return ctx;\n};\n\nexport namespace ComposerPrimitiveTriggerPopover {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = Omit<\n ComponentPropsWithoutRef<typeof Primitive.div>,\n \"onSelect\"\n > & {\n /** The character(s) that activate this trigger (e.g. `\"@\"`, `\"/\"`). Also serves as the trigger identity within the root. */\n readonly char: string;\n /** Adapter providing categories and items. */\n readonly adapter?: Unstable_TriggerAdapter | undefined;\n };\n}\n\n/**\n * Declares a trigger and renders its popover container. The popover only\n * renders its DOM (and children) when the trigger character is active in the\n * composer input and a behavior sub-primitive has been registered.\n *\n * A behavior is contributed by rendering exactly one of\n * `<TriggerPopover.Directive>` or `<TriggerPopover.Action>` as a child. Without\n * a behavior the trigger stays closed.\n *\n * Must be placed inside `ComposerPrimitive.Unstable_TriggerPopoverRoot`.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Unstable_TriggerPopover\n * char=\"@\"\n * adapter={mentionAdapter}\n * >\n * <ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />\n * <ComposerPrimitive.Unstable_TriggerPopoverCategories>\n * {(cats) => cats.map(...)}\n * </ComposerPrimitive.Unstable_TriggerPopoverCategories>\n * <ComposerPrimitive.Unstable_TriggerPopoverItems>\n * {(items) => items.map(...)}\n * </ComposerPrimitive.Unstable_TriggerPopoverItems>\n * </ComposerPrimitive.Unstable_TriggerPopover>\n * ```\n */\nexport const ComposerPrimitiveTriggerPopover = forwardRef<\n ComposerPrimitiveTriggerPopover.Element,\n ComposerPrimitiveTriggerPopover.Props\n>(\n (\n { char, adapter, \"aria-label\": ariaLabel, children, ...props },\n forwardedRef,\n ) => {\n const aui = useAui();\n const text = useAuiState((s) => s.composer.text);\n const popoverId = useId();\n\n // Track in state (for resource reactivity) + ref (dev warning on duplicate registrations).\n const behaviorRef = useRef<TriggerBehavior | null>(null);\n const [behavior, setBehavior] = useState<TriggerBehavior | null>(null);\n const registrationCountRef = useRef(0);\n\n const register = useCallback<TriggerBehaviorRegistration[\"register\"]>(\n (next) => {\n registrationCountRef.current += 1;\n if (\n process.env.NODE_ENV !== \"production\" &&\n registrationCountRef.current > 1\n ) {\n console.warn(\n `[assistant-ui] TriggerPopover \"${char}\" received more than one behavior child. Exactly one <TriggerPopover.Directive> or <TriggerPopover.Action> is allowed per TriggerPopover; the last registration wins.`,\n );\n }\n behaviorRef.current = next;\n setBehavior(next);\n return () => {\n registrationCountRef.current = Math.max(\n 0,\n registrationCountRef.current - 1,\n );\n if (behaviorRef.current === next) {\n behaviorRef.current = null;\n setBehavior(null);\n }\n };\n },\n [char],\n );\n\n const registration = useMemo<TriggerBehaviorRegistration>(\n () => ({ register }),\n [register],\n );\n\n const resource = useResource(\n TriggerPopoverResource({\n adapter,\n text,\n triggerChar: char,\n behavior: behavior ?? undefined,\n aui,\n popoverId,\n }),\n );\n\n // Wrapper changes per render, but tap-stable methods inside don't.\n const resourceRef = useRef(resource);\n resourceRef.current = resource;\n\n const root = useTriggerPopoverRootContext();\n useEffect(() => {\n return root.register({\n char,\n ...(behavior ? { behavior } : {}),\n resource: resourceRef.current,\n });\n }, [root, char, behavior]);\n\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n useEffect(() => {\n if (!pluginRegistry) return undefined;\n return pluginRegistry.register(resourceRef.current);\n }, [pluginRegistry]);\n\n const open = behavior !== null && resource.open;\n\n const aria = useTriggerPopoverAriaPublish();\n\n useEffect(() => {\n if (!open) return undefined;\n return () => {\n aria.setActiveAria(char, null);\n };\n }, [aria, char, open]);\n\n useEffect(() => {\n if (!open) return;\n aria.setActiveAria(char, {\n popoverId,\n highlightedItemId: resource.highlightedItemId,\n });\n }, [aria, char, popoverId, open, resource.highlightedItemId]);\n\n return (\n <TriggerBehaviorRegistrationContext.Provider value={registration}>\n <TriggerPopoverScopeContext.Provider value={resource}>\n {open ? (\n <Primitive.div\n role=\"listbox\"\n id={popoverId}\n aria-label={ariaLabel ?? \"Suggestions\"}\n aria-activedescendant={resource.highlightedItemId}\n data-state=\"open\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Primitive.div>\n ) : (\n children\n )}\n </TriggerPopoverScopeContext.Provider>\n </TriggerBehaviorRegistrationContext.Provider>\n );\n },\n);\n\nComposerPrimitiveTriggerPopover.displayName =\n \"ComposerPrimitive.TriggerPopover\";\n"],"mappings":";;;;;;;;;;AA8BA,MAAM,6BACJ,cAAmD,IAAI;AAEzD,MAAa,sCAAsC;CACjD,MAAM,MAAM,WAAW,0BAA0B;CACjD,IAAI,CAAC,KACH,MAAM,IAAI,MACR,oFACF;CACF,OAAO;AACT;AAEA,MAAa,8CACX,WAAW,0BAA0B;AAOvC,MAAM,qCACJ,cAAkD,IAAI;;AAGxD,MAAa,uCAAuC;CAClD,MAAM,MAAM,WAAW,kCAAkC;CACzD,IAAI,CAAC,KACH,MAAM,IAAI,MACR,2GACF;CACF,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAa,kCAAkC,YAK3C,EAAE,MAAM,SAAS,cAAc,WAAW,UAAU,GAAG,SACvD,iBACG;CACH,MAAM,MAAM,OAAO;CACnB,MAAM,OAAO,aAAa,MAAM,EAAE,SAAS,IAAI;CAC/C,MAAM,YAAY,MAAM;CAGxB,MAAM,cAAc,OAA+B,IAAI;CACvD,MAAM,CAAC,UAAU,eAAe,SAAiC,IAAI;CACrE,MAAM,uBAAuB,OAAO,CAAC;CAErC,MAAM,WAAW,aACd,SAAS;EACR,qBAAqB,WAAW;EAChC,IACE,QAAQ,IAAI,aAAa,gBACzB,qBAAqB,UAAU,GAE/B,QAAQ,KACN,kCAAkC,KAAK,sKACzC;EAEF,YAAY,UAAU;EACtB,YAAY,IAAI;EAChB,aAAa;GACX,qBAAqB,UAAU,KAAK,IAClC,GACA,qBAAqB,UAAU,CACjC;GACA,IAAI,YAAY,YAAY,MAAM;IAChC,YAAY,UAAU;IACtB,YAAY,IAAI;GAClB;EACF;CACF,GACA,CAAC,IAAI,CACP;CAEA,MAAM,eAAe,eACZ,EAAE,SAAS,IAClB,CAAC,QAAQ,CACX;CAEA,MAAM,WAAW,YACf,uBAAuB;EACrB;EACA;EACA,aAAa;EACb,UAAU,YAAY,KAAA;EACtB;EACA;CACF,CAAC,CACH;CAGA,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CAEtB,MAAM,OAAO,6BAA6B;CAC1C,gBAAgB;EACd,OAAO,KAAK,SAAS;GACnB;GACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GAC/B,UAAU,YAAY;EACxB,CAAC;CACH,GAAG;EAAC;EAAM;EAAM;CAAQ,CAAC;CAEzB,MAAM,iBAAiB,uCAAuC;CAC9D,gBAAgB;EACd,IAAI,CAAC,gBAAgB,OAAO,KAAA;EAC5B,OAAO,eAAe,SAAS,YAAY,OAAO;CACpD,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,OAAO,aAAa,QAAQ,SAAS;CAE3C,MAAM,OAAO,6BAA6B;CAE1C,gBAAgB;EACd,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,aAAa;GACX,KAAK,cAAc,MAAM,IAAI;EAC/B;CACF,GAAG;EAAC;EAAM;EAAM;CAAI,CAAC;CAErB,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,KAAK,cAAc,MAAM;GACvB;GACA,mBAAmB,SAAS;EAC9B,CAAC;CACH,GAAG;EAAC;EAAM;EAAM;EAAW;EAAM,SAAS;CAAiB,CAAC;CAE5D,OACE,oBAAC,mCAAmC,UAApC;EAA6C,OAAO;YAClD,oBAAC,2BAA2B,UAA5B;GAAqC,OAAO;aACzC,OACC,oBAAC,UAAU,KAAX;IACE,MAAK;IACL,IAAI;IACJ,cAAY,aAAa;IACzB,yBAAuB,SAAS;IAChC,cAAW;IACX,GAAI;IACJ,KAAK;IAEJ;GACY,CAAA,IAEf;EAEiC,CAAA;CACM,CAAA;AAEjD,CACF;AAEA,gCAAgC,cAC9B"}
1
+ {"version":3,"file":"TriggerPopover.js","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopover.tsx"],"sourcesContent":["\"use client\";\n\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useResource } from \"@assistant-ui/tap\";\nimport type { Unstable_TriggerAdapter } from \"@assistant-ui/core\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ComponentRef,\n} from \"react\";\nimport { Primitive } from \"../../../utils/Primitive\";\nimport { useComposerInputPluginRegistryOptional } from \"../ComposerInputPluginContext\";\nimport {\n TriggerPopoverResource,\n type TriggerPopoverResourceOutput,\n} from \"./TriggerPopoverResource\";\nimport type { TriggerBehavior } from \"./triggerSelectionResource\";\nimport {\n useTriggerPopoverAriaPublish,\n useTriggerPopoverRootContext,\n} from \"./TriggerPopoverRootContext\";\n\nconst TriggerPopoverScopeContext =\n createContext<TriggerPopoverResourceOutput | null>(null);\n\nexport const useTriggerPopoverScopeContext = () => {\n const ctx = useContext(TriggerPopoverScopeContext);\n if (!ctx)\n throw new Error(\n \"useTriggerPopoverScopeContext must be used within ComposerPrimitive.TriggerPopover\",\n );\n return ctx;\n};\n\nexport const useTriggerPopoverScopeContextOptional = () =>\n useContext(TriggerPopoverScopeContext);\n\n/** Registration API exposed to behavior sub-primitives. */\nexport type TriggerBehaviorRegistration = {\n register(behavior: TriggerBehavior): () => void;\n};\n\nconst TriggerBehaviorRegistrationContext =\n createContext<TriggerBehaviorRegistration | null>(null);\n\n/** Obtain the registration handle from the parent `<TriggerPopover>`. */\nexport const useTriggerBehaviorRegistration = () => {\n const ctx = useContext(TriggerBehaviorRegistrationContext);\n if (!ctx)\n throw new Error(\n \"TriggerPopover.Directive / TriggerPopover.Action must be rendered inside ComposerPrimitive.TriggerPopover\",\n );\n return ctx;\n};\n\nexport namespace ComposerPrimitiveTriggerPopover {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = Omit<\n ComponentPropsWithoutRef<typeof Primitive.div>,\n \"onSelect\"\n > & {\n /** The character(s) that activate this trigger (e.g. `\"@\"`, `\"/\"`). Also serves as the trigger identity within the root. */\n readonly char: string;\n /** Adapter providing categories and items. */\n readonly adapter?: Unstable_TriggerAdapter | undefined;\n };\n}\n\n/**\n * Declares a trigger and renders its popover container. The popover only\n * renders its DOM (and children) when the trigger character is active in the\n * composer input and a behavior sub-primitive has been registered.\n *\n * A behavior is contributed by rendering exactly one of\n * `<TriggerPopover.Directive>` or `<TriggerPopover.Action>` as a child. Without\n * a behavior the trigger stays closed.\n *\n * Must be placed inside `ComposerPrimitive.Unstable_TriggerPopoverRoot`.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.Unstable_TriggerPopover\n * char=\"@\"\n * adapter={mentionAdapter}\n * >\n * <ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />\n * <ComposerPrimitive.Unstable_TriggerPopoverCategories>\n * {(cats) => cats.map(...)}\n * </ComposerPrimitive.Unstable_TriggerPopoverCategories>\n * <ComposerPrimitive.Unstable_TriggerPopoverItems>\n * {(items) => items.map(...)}\n * </ComposerPrimitive.Unstable_TriggerPopoverItems>\n * </ComposerPrimitive.Unstable_TriggerPopover>\n * ```\n */\nexport const ComposerPrimitiveTriggerPopover = forwardRef<\n ComposerPrimitiveTriggerPopover.Element,\n ComposerPrimitiveTriggerPopover.Props\n>(\n (\n { char, adapter, \"aria-label\": ariaLabel, children, ...props },\n forwardedRef,\n ) => {\n const aui = useAui();\n const text = useAuiState((s) => s.composer.text);\n const popoverId = useId();\n\n // Track in state (for resource reactivity) + ref (dev warning on duplicate registrations).\n const behaviorRef = useRef<TriggerBehavior | null>(null);\n const [behavior, setBehavior] = useState<TriggerBehavior | null>(null);\n const registrationCountRef = useRef(0);\n\n const register = useCallback<TriggerBehaviorRegistration[\"register\"]>(\n (next) => {\n registrationCountRef.current += 1;\n if (\n process.env.NODE_ENV !== \"production\" &&\n registrationCountRef.current > 1\n ) {\n console.warn(\n `[assistant-ui] TriggerPopover \"${char}\" received more than one behavior child. Exactly one <TriggerPopover.Directive> or <TriggerPopover.Action> is allowed per TriggerPopover; the last registration wins.`,\n );\n }\n behaviorRef.current = next;\n setBehavior(next);\n return () => {\n registrationCountRef.current = Math.max(\n 0,\n registrationCountRef.current - 1,\n );\n if (behaviorRef.current === next) {\n behaviorRef.current = null;\n setBehavior(null);\n }\n };\n },\n [char],\n );\n\n const registration = useMemo<TriggerBehaviorRegistration>(\n () => ({ register }),\n [register],\n );\n\n const resource = useResource(\n TriggerPopoverResource({\n adapter,\n text,\n triggerChar: char,\n behavior: behavior ?? undefined,\n aui,\n popoverId,\n }),\n );\n\n // Wrapper changes per render, but tap-stable methods inside don't.\n const resourceRef = useRef(resource);\n resourceRef.current = resource;\n\n const root = useTriggerPopoverRootContext();\n useEffect(() => {\n return root.register({\n char,\n ...(behavior ? { behavior } : {}),\n resource: resourceRef.current,\n });\n }, [root, char, behavior]);\n\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n useEffect(() => {\n if (!pluginRegistry) return undefined;\n return pluginRegistry.register(resourceRef.current);\n }, [pluginRegistry]);\n\n const open = behavior !== null && resource.open;\n\n const aria = useTriggerPopoverAriaPublish();\n\n useEffect(() => {\n if (!open) return undefined;\n return () => {\n aria.setActiveAria(char, null);\n };\n }, [aria, char, open]);\n\n useEffect(() => {\n if (!open) return;\n aria.setActiveAria(char, {\n popoverId,\n highlightedItemId: resource.highlightedItemId,\n });\n }, [aria, char, popoverId, open, resource.highlightedItemId]);\n\n return (\n <TriggerBehaviorRegistrationContext.Provider value={registration}>\n <TriggerPopoverScopeContext.Provider value={resource}>\n {open ? (\n <Primitive.div\n role=\"listbox\"\n id={popoverId}\n aria-label={ariaLabel ?? \"Suggestions\"}\n aria-activedescendant={resource.highlightedItemId}\n data-state=\"open\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Primitive.div>\n ) : (\n children\n )}\n </TriggerPopoverScopeContext.Provider>\n </TriggerBehaviorRegistrationContext.Provider>\n );\n },\n);\n\nComposerPrimitiveTriggerPopover.displayName =\n \"ComposerPrimitive.TriggerPopover\";\n"],"mappings":";;;;;;;;;;AA8BA,MAAM,6BACJ,cAAmD,IAAI;AAEzD,MAAa,sCAAsC;CACjD,MAAM,MAAM,WAAW,0BAA0B;CACjD,IAAI,CAAC,KACH,MAAM,IAAI,MACR,oFACF;CACF,OAAO;AACT;AAEA,MAAa,8CACX,WAAW,0BAA0B;AAOvC,MAAM,qCACJ,cAAkD,IAAI;;AAGxD,MAAa,uCAAuC;CAClD,MAAM,MAAM,WAAW,kCAAkC;CACzD,IAAI,CAAC,KACH,MAAM,IAAI,MACR,2GACF;CACF,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAa,kCAAkC,YAK3C,EAAE,MAAM,SAAS,cAAc,WAAW,UAAU,GAAG,SACvD,iBACG;CACH,MAAM,MAAM,OAAO;CACnB,MAAM,OAAO,aAAa,MAAM,EAAE,SAAS,IAAI;CAC/C,MAAM,YAAY,MAAM;CAGxB,MAAM,cAAc,OAA+B,IAAI;CACvD,MAAM,CAAC,UAAU,eAAe,SAAiC,IAAI;CACrE,MAAM,uBAAuB,OAAO,CAAC;CAErC,MAAM,WAAW,aACd,SAAS;EACR,qBAAqB,WAAW;EAChC,IACE,QAAQ,IAAI,aAAa,gBACzB,qBAAqB,UAAU,GAE/B,QAAQ,KACN,kCAAkC,KAAK,sKACzC;EAEF,YAAY,UAAU;EACtB,YAAY,IAAI;EAChB,aAAa;GACX,qBAAqB,UAAU,KAAK,IAClC,GACA,qBAAqB,UAAU,CACjC;GACA,IAAI,YAAY,YAAY,MAAM;IAChC,YAAY,UAAU;IACtB,YAAY,IAAI;GAClB;EACF;CACF,GACA,CAAC,IAAI,CACP;CAEA,MAAM,eAAe,eACZ,EAAE,SAAS,IAClB,CAAC,QAAQ,CACX;CAEA,MAAM,WAAW,YACf,uBAAuB;EACrB;EACA;EACA,aAAa;EACb,UAAU,YAAY,KAAA;EACtB;EACA;CACF,CAAC,CACH;CAGA,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CAEtB,MAAM,OAAO,6BAA6B;CAC1C,gBAAgB;EACd,OAAO,KAAK,SAAS;GACnB;GACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GAC/B,UAAU,YAAY;EACxB,CAAC;CACH,GAAG;EAAC;EAAM;EAAM;CAAQ,CAAC;CAEzB,MAAM,iBAAiB,uCAAuC;CAC9D,gBAAgB;EACd,IAAI,CAAC,gBAAgB,OAAO,KAAA;EAC5B,OAAO,eAAe,SAAS,YAAY,OAAO;CACpD,GAAG,CAAC,cAAc,CAAC;CAEnB,MAAM,OAAO,aAAa,QAAQ,SAAS;CAE3C,MAAM,OAAO,6BAA6B;CAE1C,gBAAgB;EACd,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,aAAa;GACX,KAAK,cAAc,MAAM,IAAI;EAC/B;CACF,GAAG;EAAC;EAAM;EAAM;CAAI,CAAC;CAErB,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,KAAK,cAAc,MAAM;GACvB;GACA,mBAAmB,SAAS;EAC9B,CAAC;CACH,GAAG;EAAC;EAAM;EAAM;EAAW;EAAM,SAAS;CAAiB,CAAC;CAE5D,OACE,oBAAC,mCAAmC,UAApC;EAA6C,OAAO;YAClD,oBAAC,2BAA2B,UAA5B;GAAqC,OAAO;aACzC,OACC,oBAAC,UAAU,KAAX;IACE,MAAK;IACL,IAAI;IACJ,cAAY,aAAa;IACzB,yBAAuB,SAAS;IAChC,cAAW;IACX,GAAI;IACJ,KAAK;IAEJ;GACY,CAAA,IAEf;EAEiC,CAAA;CACM,CAAA;AAEjD,CACF;AAEA,gCAAgC,cAC9B"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useTriggerBehaviorRegistration } from "./TriggerPopover.js";
3
3
  import { unstable_defaultDirectiveFormatter } from "@assistant-ui/core";
4
- import { useEffect, useRef } from "react";
4
+ import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
5
5
  //#region src/primitives/composer/trigger/TriggerPopoverAction.tsx
6
6
  /**
7
7
  * Configures a `<TriggerPopover>` to fire a handler when an item is selected,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../../utils/Primitive.js";
3
3
  import { useTriggerPopoverScopeContext } from "./TriggerPopover.js";
4
- import { forwardRef } from "react";
4
+ import { forwardRef } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  //#region src/primitives/composer/trigger/TriggerPopoverBack.tsx
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../../utils/Primitive.js";
3
3
  import { useTriggerPopoverScopeContext } from "./TriggerPopover.js";
4
- import { forwardRef, useCallback } from "react";
4
+ import { forwardRef, useCallback } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  //#region src/primitives/composer/trigger/TriggerPopoverCategories.tsx
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useTriggerBehaviorRegistration } from "./TriggerPopover.js";
3
3
  import { unstable_defaultDirectiveFormatter } from "@assistant-ui/core";
4
- import { useEffect, useRef } from "react";
4
+ import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
5
5
  //#region src/primitives/composer/trigger/TriggerPopoverDirective.tsx
6
6
  /**
7
7
  * Configures a `<TriggerPopover>` to insert a directive chip when an item is
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../../utils/Primitive.js";
3
3
  import { useTriggerPopoverScopeContext } from "./TriggerPopover.js";
4
- import { forwardRef, useCallback } from "react";
4
+ import { forwardRef, useCallback } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  //#region src/primitives/composer/trigger/TriggerPopoverItems.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPopoverResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopoverResource.ts"],"mappings":";;;;;;;KAoBY,gBAAA,GAAmB,eAAe;AAAA,KAElC,4BAAA;EAAA,SACD,IAAA;EAAA,SACA,KAAA;EAAA,SACA,gBAAA;EAAA,SACA,UAAA,WAAqB,wBAAA;EAAA,SACrB,KAAA,WAAgB,oBAAA;EAAA,SAChB,gBAAA;EAAA,SACA,YAAA,WAFgB;EAAA,SAIhB,SAAA,UAiBsB;EAAA,SAftB,iBAAA;EAET,cAAA,CAAe,UAAA;EACf,MAAA;EACA,UAAA,CAAW,IAAA,EAAM,oBAAA;EACjB,KAAA,UAZS;EAcT,cAAA,CAAe,KAAA;EACf,aAAA,CAAc,CAAA;IAAA,SACH,GAAA;IAAA,SACA,QAAA;IACT,cAAA;EAAA;EAGF,iBAAA,CAAkB,GAAA;EAClB,0BAAA,CAA2B,EAAA,EAAI,kBAAA;AAAA;;cAIpB,sBAAA,GAAsB,KAAA;WAStB,uBAAA;;;YAGC,eAAA;OACL,eAAA,EAxBP;;;WAoBW,uBAAA;;;YAGC,eAAA;OACL,eAAA,EAjBwB"}
1
+ {"version":3,"file":"TriggerPopoverResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopoverResource.ts"],"mappings":";;;;;;;KAqBY,gBAAA,GAAmB,eAAe;AAAA,KAElC,4BAAA;EAAA,SACD,IAAA;EAAA,SACA,KAAA;EAAA,SACA,gBAAA;EAAA,SACA,UAAA,WAAqB,wBAAA;EAAA,SACrB,KAAA,WAAgB,oBAAA;EAAA,SAChB,gBAAA;EAAA,SACA,YAAA,WAFgB;EAAA,SAIhB,SAAA,UAiBsB;EAAA,SAftB,iBAAA;EAET,cAAA,CAAe,UAAA;EACf,MAAA;EACA,UAAA,CAAW,IAAA,EAAM,oBAAA;EACjB,KAAA,UAZS;EAcT,cAAA,CAAe,KAAA;EACf,aAAA,CAAc,CAAA;IAAA,SACH,GAAA;IAAA,SACA,QAAA;IACT,cAAA;EAAA;EAGF,iBAAA,CAAkB,GAAA;EAClB,0BAAA,CAA2B,EAAA,EAAI,kBAAA;AAAA;;cAIpB,sBAAA,GAAsB,KAAA;WAQxB,uBAAA;;;YAGC,eAAA;OACL,eAAA,EAvBL;;;WAmBS,uBAAA;;;YAGC,eAAA;OACL,eAAA,EAhB0B"}
@@ -2,24 +2,25 @@ import { TriggerDetectionResource } from "./triggerDetectionResource.js";
2
2
  import { TriggerKeyboardResource } from "./triggerKeyboardResource.js";
3
3
  import { TriggerNavigationResource } from "./triggerNavigationResource.js";
4
4
  import { TriggerSelectionResource } from "./triggerSelectionResource.js";
5
- import { resource, tapEffectEvent, tapResource } from "@assistant-ui/tap";
5
+ import { useEffectEvent } from "@assistant-ui/tap/react-shim";
6
+ import { resource, useResource } from "@assistant-ui/tap";
6
7
  //#region src/primitives/composer/trigger/TriggerPopoverResource.ts
7
8
  /** Composes detection, navigation, keyboard, and selection sub-resources. */
8
- const TriggerPopoverResource = resource(({ adapter, text, triggerChar, behavior, aui, popoverId }) => {
9
- const detection = tapResource(TriggerDetectionResource({
9
+ const TriggerPopoverResource = resource(function TriggerPopoverResource({ adapter, text, triggerChar, behavior, aui, popoverId }) {
10
+ const detection = useResource(TriggerDetectionResource({
10
11
  text,
11
12
  triggerChar
12
13
  }));
13
14
  const open = detection.trigger !== null && adapter !== void 0 && behavior !== void 0;
14
- const navigation = tapResource(TriggerNavigationResource({
15
+ const navigation = useResource(TriggerNavigationResource({
15
16
  adapter,
16
17
  query: detection.query,
17
18
  open
18
19
  }));
19
- const onSelected = tapEffectEvent(() => {
20
+ const onSelected = useEffectEvent(() => {
20
21
  navigation.goBack();
21
22
  });
22
- const selection = tapResource(TriggerSelectionResource({
23
+ const selection = useResource(TriggerSelectionResource({
23
24
  behavior,
24
25
  trigger: detection.trigger,
25
26
  aui,
@@ -27,7 +28,7 @@ const TriggerPopoverResource = resource(({ adapter, text, triggerChar, behavior,
27
28
  setCursorPosition: detection.setCursorPosition,
28
29
  onSelected
29
30
  }));
30
- const keyboard = tapResource(TriggerKeyboardResource({
31
+ const keyboard = useResource(TriggerKeyboardResource({
31
32
  navigableList: navigation.navigableList,
32
33
  isSearchMode: navigation.isSearchMode,
33
34
  activeCategoryId: navigation.activeCategoryId,
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPopoverResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopoverResource.ts"],"sourcesContent":["import { resource, tapEffectEvent, tapResource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport { TriggerDetectionResource } from \"./triggerDetectionResource\";\nimport { TriggerKeyboardResource } from \"./triggerKeyboardResource\";\nimport { TriggerNavigationResource } from \"./triggerNavigationResource\";\nimport {\n TriggerSelectionResource,\n type SelectItemOverride,\n type TriggerBehavior,\n} from \"./triggerSelectionResource\";\n\nexport type { SelectItemOverride, TriggerBehavior };\nexport type { TriggerPopoverKeyEvent } from \"./triggerKeyboardResource\";\n\n/** @deprecated Use `TriggerBehavior`. */\nexport type OnSelectBehavior = TriggerBehavior;\n\nexport type TriggerPopoverResourceOutput = {\n readonly open: boolean;\n readonly query: string;\n readonly activeCategoryId: string | null;\n readonly categories: readonly Unstable_TriggerCategory[];\n readonly items: readonly Unstable_TriggerItem[];\n readonly highlightedIndex: number;\n readonly isSearchMode: boolean;\n /** Stable ID prefix for generating accessible element IDs. */\n readonly popoverId: string;\n /** ID of the currently highlighted item (for aria-activedescendant). */\n readonly highlightedItemId: string | undefined;\n\n selectCategory(categoryId: string): void;\n goBack(): void;\n selectItem(item: Unstable_TriggerItem): void;\n close(): void;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n handleKeyDown(e: {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n }): boolean;\n\n setCursorPosition(pos: number): void;\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Composes detection, navigation, keyboard, and selection sub-resources. */\nexport const TriggerPopoverResource = resource(\n ({\n adapter,\n text,\n triggerChar,\n behavior,\n aui,\n popoverId,\n }: {\n adapter: Unstable_TriggerAdapter | undefined;\n text: string;\n triggerChar: string;\n behavior: TriggerBehavior | undefined;\n aui: AssistantClient;\n /** Stable ID for accessible element IDs (pass React's useId() from component layer). */\n popoverId: string;\n }): TriggerPopoverResourceOutput => {\n const detection = tapResource(\n TriggerDetectionResource({ text, triggerChar }),\n );\n\n const open =\n detection.trigger !== null &&\n adapter !== undefined &&\n behavior !== undefined;\n\n const navigation = tapResource(\n TriggerNavigationResource({\n adapter,\n query: detection.query,\n open,\n }),\n );\n\n const onSelected = tapEffectEvent(() => {\n navigation.goBack();\n });\n\n const selection = tapResource(\n TriggerSelectionResource({\n behavior,\n trigger: detection.trigger,\n aui,\n triggerChar,\n setCursorPosition: detection.setCursorPosition,\n onSelected,\n }),\n );\n\n const keyboard = tapResource(\n TriggerKeyboardResource({\n navigableList: navigation.navigableList,\n isSearchMode: navigation.isSearchMode,\n activeCategoryId: navigation.activeCategoryId,\n query: detection.query,\n popoverId,\n open,\n selectItem: selection.selectItem,\n selectCategory: navigation.selectCategory,\n goBack: navigation.goBack,\n close: selection.close,\n }),\n );\n\n return {\n open,\n query: detection.query,\n activeCategoryId: navigation.activeCategoryId,\n categories: navigation.categories,\n items: navigation.items,\n highlightedIndex: keyboard.highlightedIndex,\n isSearchMode: navigation.isSearchMode,\n popoverId,\n highlightedItemId: keyboard.highlightedItemId,\n selectCategory: navigation.selectCategory,\n goBack: navigation.goBack,\n selectItem: selection.selectItem,\n close: selection.close,\n highlightIndex: keyboard.highlightIndex,\n handleKeyDown: keyboard.handleKeyDown,\n setCursorPosition: detection.setCursorPosition,\n registerSelectItemOverride: selection.registerSelectItemOverride,\n };\n },\n);\n"],"mappings":";;;;;;;AAoDA,MAAa,yBAAyB,UACnC,EACC,SACA,MACA,aACA,UACA,KACA,gBASkC;CAClC,MAAM,YAAY,YAChB,yBAAyB;EAAE;EAAM;CAAY,CAAC,CAChD;CAEA,MAAM,OACJ,UAAU,YAAY,QACtB,YAAY,KAAA,KACZ,aAAa,KAAA;CAEf,MAAM,aAAa,YACjB,0BAA0B;EACxB;EACA,OAAO,UAAU;EACjB;CACF,CAAC,CACH;CAEA,MAAM,aAAa,qBAAqB;EACtC,WAAW,OAAO;CACpB,CAAC;CAED,MAAM,YAAY,YAChB,yBAAyB;EACvB;EACA,SAAS,UAAU;EACnB;EACA;EACA,mBAAmB,UAAU;EAC7B;CACF,CAAC,CACH;CAEA,MAAM,WAAW,YACf,wBAAwB;EACtB,eAAe,WAAW;EAC1B,cAAc,WAAW;EACzB,kBAAkB,WAAW;EAC7B,OAAO,UAAU;EACjB;EACA;EACA,YAAY,UAAU;EACtB,gBAAgB,WAAW;EAC3B,QAAQ,WAAW;EACnB,OAAO,UAAU;CACnB,CAAC,CACH;CAEA,OAAO;EACL;EACA,OAAO,UAAU;EACjB,kBAAkB,WAAW;EAC7B,YAAY,WAAW;EACvB,OAAO,WAAW;EAClB,kBAAkB,SAAS;EAC3B,cAAc,WAAW;EACzB;EACA,mBAAmB,SAAS;EAC5B,gBAAgB,WAAW;EAC3B,QAAQ,WAAW;EACnB,YAAY,UAAU;EACtB,OAAO,UAAU;EACjB,gBAAgB,SAAS;EACzB,eAAe,SAAS;EACxB,mBAAmB,UAAU;EAC7B,4BAA4B,UAAU;CACxC;AACF,CACF"}
1
+ {"version":3,"file":"TriggerPopoverResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/TriggerPopoverResource.ts"],"sourcesContent":["import { useEffectEvent } from \"react\";\nimport { useResource, resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport { TriggerDetectionResource } from \"./triggerDetectionResource\";\nimport { TriggerKeyboardResource } from \"./triggerKeyboardResource\";\nimport { TriggerNavigationResource } from \"./triggerNavigationResource\";\nimport {\n TriggerSelectionResource,\n type SelectItemOverride,\n type TriggerBehavior,\n} from \"./triggerSelectionResource\";\n\nexport type { SelectItemOverride, TriggerBehavior };\nexport type { TriggerPopoverKeyEvent } from \"./triggerKeyboardResource\";\n\n/** @deprecated Use `TriggerBehavior`. */\nexport type OnSelectBehavior = TriggerBehavior;\n\nexport type TriggerPopoverResourceOutput = {\n readonly open: boolean;\n readonly query: string;\n readonly activeCategoryId: string | null;\n readonly categories: readonly Unstable_TriggerCategory[];\n readonly items: readonly Unstable_TriggerItem[];\n readonly highlightedIndex: number;\n readonly isSearchMode: boolean;\n /** Stable ID prefix for generating accessible element IDs. */\n readonly popoverId: string;\n /** ID of the currently highlighted item (for aria-activedescendant). */\n readonly highlightedItemId: string | undefined;\n\n selectCategory(categoryId: string): void;\n goBack(): void;\n selectItem(item: Unstable_TriggerItem): void;\n close(): void;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n handleKeyDown(e: {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n }): boolean;\n\n setCursorPosition(pos: number): void;\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Composes detection, navigation, keyboard, and selection sub-resources. */\nexport const TriggerPopoverResource = resource(function TriggerPopoverResource({\n adapter,\n text,\n triggerChar,\n behavior,\n aui,\n popoverId,\n}: {\n adapter: Unstable_TriggerAdapter | undefined;\n text: string;\n triggerChar: string;\n behavior: TriggerBehavior | undefined;\n aui: AssistantClient;\n /** Stable ID for accessible element IDs (pass React's useId() from component layer). */\n popoverId: string;\n}): TriggerPopoverResourceOutput {\n const detection = useResource(\n TriggerDetectionResource({ text, triggerChar }),\n );\n\n const open =\n detection.trigger !== null &&\n adapter !== undefined &&\n behavior !== undefined;\n\n const navigation = useResource(\n TriggerNavigationResource({\n adapter,\n query: detection.query,\n open,\n }),\n );\n\n const onSelected = useEffectEvent(() => {\n navigation.goBack();\n });\n\n const selection = useResource(\n TriggerSelectionResource({\n behavior,\n trigger: detection.trigger,\n aui,\n triggerChar,\n setCursorPosition: detection.setCursorPosition,\n onSelected,\n }),\n );\n\n const keyboard = useResource(\n TriggerKeyboardResource({\n navigableList: navigation.navigableList,\n isSearchMode: navigation.isSearchMode,\n activeCategoryId: navigation.activeCategoryId,\n query: detection.query,\n popoverId,\n open,\n selectItem: selection.selectItem,\n selectCategory: navigation.selectCategory,\n goBack: navigation.goBack,\n close: selection.close,\n }),\n );\n\n return {\n open,\n query: detection.query,\n activeCategoryId: navigation.activeCategoryId,\n categories: navigation.categories,\n items: navigation.items,\n highlightedIndex: keyboard.highlightedIndex,\n isSearchMode: navigation.isSearchMode,\n popoverId,\n highlightedItemId: keyboard.highlightedItemId,\n selectCategory: navigation.selectCategory,\n goBack: navigation.goBack,\n selectItem: selection.selectItem,\n close: selection.close,\n highlightIndex: keyboard.highlightIndex,\n handleKeyDown: keyboard.handleKeyDown,\n setCursorPosition: detection.setCursorPosition,\n registerSelectItemOverride: selection.registerSelectItemOverride,\n };\n});\n"],"mappings":";;;;;;;;AAqDA,MAAa,yBAAyB,SAAS,SAAS,uBAAuB,EAC7E,SACA,MACA,aACA,UACA,KACA,aAS+B;CAC/B,MAAM,YAAY,YAChB,yBAAyB;EAAE;EAAM;CAAY,CAAC,CAChD;CAEA,MAAM,OACJ,UAAU,YAAY,QACtB,YAAY,KAAA,KACZ,aAAa,KAAA;CAEf,MAAM,aAAa,YACjB,0BAA0B;EACxB;EACA,OAAO,UAAU;EACjB;CACF,CAAC,CACH;CAEA,MAAM,aAAa,qBAAqB;EACtC,WAAW,OAAO;CACpB,CAAC;CAED,MAAM,YAAY,YAChB,yBAAyB;EACvB;EACA,SAAS,UAAU;EACnB;EACA;EACA,mBAAmB,UAAU;EAC7B;CACF,CAAC,CACH;CAEA,MAAM,WAAW,YACf,wBAAwB;EACtB,eAAe,WAAW;EAC1B,cAAc,WAAW;EACzB,kBAAkB,WAAW;EAC7B,OAAO,UAAU;EACjB;EACA;EACA,YAAY,UAAU;EACtB,gBAAgB,WAAW;EAC3B,QAAQ,WAAW;EACnB,OAAO,UAAU;CACnB,CAAC,CACH;CAEA,OAAO;EACL;EACA,OAAO,UAAU;EACjB,kBAAkB,WAAW;EAC7B,YAAY,WAAW;EACvB,OAAO,WAAW;EAClB,kBAAkB,SAAS;EAC3B,cAAc,WAAW;EACzB;EACA,mBAAmB,SAAS;EAC5B,gBAAgB,WAAW;EAC3B,QAAQ,WAAW;EACnB,YAAY,UAAU;EACtB,OAAO,UAAU;EACjB,gBAAgB,SAAS;EACzB,eAAe,SAAS;EACxB,mBAAmB,UAAU;EAC7B,4BAA4B,UAAU;CACxC;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { ComposerInputPluginProvider, useComposerInputPluginRegistryOptional } from "../ComposerInputPluginContext.js";
3
- import { createContext, useCallback, useContext, useMemo, useRef, useSyncExternalStore } from "react";
3
+ import { createContext, useCallback, useContext, useMemo, useRef, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/primitives/composer/trigger/TriggerPopoverRootContext.tsx
6
6
  const TriggerPopoverRootContext = createContext(null);
@@ -1 +1 @@
1
- {"version":3,"file":"triggerDetectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"mappings":";;KAIY,eAAA;EAAA,SACD,MAAA;EAAA,SACA,KAAK;AAAA;AAAA,KAGJ,8BAAA;EAAA,2DAED,OAAA,EAAS,eAAe;WAExB,KAAA,UAFA;EAIT,iBAAA,CAAkB,GAAA;AAAA;;cAIP,wBAAA,GAAwB,KAAA;;;kDAuBpC,8BAAA"}
1
+ {"version":3,"file":"triggerDetectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"mappings":";;KAKY,eAAA;EAAA,SACD,MAAA;EAAA,SACA,KAAK;AAAA;AAAA,KAGJ,8BAAA;EAAA,2DAED,OAAA,EAAS,eAAe;WAExB,KAAA,UAFA;EAIT,iBAAA,CAAkB,GAAA;AAAA;;cAIP,wBAAA,GAAwB,KAAA;;;kDAuBpC,8BAAA"}
@@ -1,10 +1,11 @@
1
1
  import { detectTrigger } from "./detectTrigger.js";
2
- import { resource, tapMemo, tapState } from "@assistant-ui/tap";
2
+ import { useMemo, useState } from "@assistant-ui/tap/react-shim";
3
+ import { resource } from "@assistant-ui/tap";
3
4
  //#region src/primitives/composer/trigger/triggerDetectionResource.ts
4
5
  /** Tracks cursor position and derives the active trigger + query from composer text. */
5
- const TriggerDetectionResource = resource(({ text, triggerChar }) => {
6
- const [cursorPosition, setCursorPosition] = tapState(text.length);
7
- const trigger = tapMemo(() => {
6
+ const TriggerDetectionResource = resource(function TriggerDetectionResource({ text, triggerChar }) {
7
+ const [cursorPosition, setCursorPosition] = useState(text.length);
8
+ const trigger = useMemo(() => {
8
9
  return detectTrigger(text, triggerChar, Math.min(cursorPosition, text.length));
9
10
  }, [
10
11
  cursorPosition,
@@ -1 +1 @@
1
- {"version":3,"file":"triggerDetectionResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { resource, tapMemo, tapState } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nexport const TriggerDetectionResource = resource(\n ({\n text,\n triggerChar,\n }: {\n text: string;\n triggerChar: string;\n }): TriggerDetectionResourceOutput => {\n const [cursorPosition, setCursorPosition] = tapState(text.length);\n\n const trigger = tapMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n },\n);\n"],"mappings":";;;;AAmBA,MAAa,2BAA2B,UACrC,EACC,MACA,kBAIoC;CACpC,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK,MAAM;CAEhE,MAAM,UAAU,cAAc;EAE5B,OAAO,cAAc,MAAM,aADf,KAAK,IAAI,gBAAgB,KAAK,MACA,CAAC;CAC7C,GAAG;EAAC;EAAgB;EAAM;CAAW,CAAC;CAItC,OAAO;EACL;EACA,OAJY,SAAS,SAAS;EAK9B;CACF;AACF,CACF"}
1
+ {"version":3,"file":"triggerDetectionResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nexport const TriggerDetectionResource = resource(\n function TriggerDetectionResource({\n text,\n triggerChar,\n }: {\n text: string;\n triggerChar: string;\n }): TriggerDetectionResourceOutput {\n const [cursorPosition, setCursorPosition] = useState(text.length);\n\n const trigger = useMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n },\n);\n"],"mappings":";;;;;AAoBA,MAAa,2BAA2B,SACtC,SAAS,yBAAyB,EAChC,MACA,eAIiC;CACjC,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK,MAAM;CAEhE,MAAM,UAAU,cAAc;EAE5B,OAAO,cAAc,MAAM,aADf,KAAK,IAAI,gBAAgB,KAAK,MACA,CAAC;CAC7C,GAAG;EAAC;EAAgB;EAAM;CAAW,CAAC;CAItC,OAAO;EACL;EACA,OAJY,SAAS,SAAS;EAK9B;CACF;AACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"triggerKeyboardResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"mappings":";;;;KAmBY,sBAAA;EAAA,SACD,GAAA;EAAA,SACA,QAAA;EACT,cAAA;AAAA;AAAA,KAGU,6BAAA;EAJD,mFAMA,gBAAA,UALK;EAAA,SAOL,iBAAA,sBAJC;EAMV,cAAA,CAAe,KAAA;EAEf,aAAA,CAAc,CAAA,EAAG,sBAAsB;AAAA;;;;;cAO5B,uBAAA,GAAuB,KAAA;2BAaP,wBAAA,GAA2B,oBAAA;;;;;;eAMvC,IAAA,EAAM,oBAAA;mBACF,UAAA;;;;2BAPQ,wBAAA,GAA2B,oBAAA;;;;;;eAMvC,IAAA,EAAM,oBAAA;mBACF,UAAA"}
1
+ {"version":3,"file":"triggerKeyboardResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"mappings":";;;;KAeY,sBAAA;EAAA,SACD,GAAA;EAAA,SACA,QAAA;EACT,cAAA;AAAA;AAAA,KAGU,6BAAA;EAJD,mFAMA,gBAAA,UALK;EAAA,SAOL,iBAAA,sBAJC;EAMV,cAAA,CAAe,KAAA;EAEf,aAAA,CAAc,CAAA,EAAG,sBAAsB;AAAA;;;;;cAO5B,uBAAA,GAAuB,KAAA;2BAaP,wBAAA,GAA2B,oBAAA;;;;;;eAMvC,IAAA,EAAM,oBAAA;mBACF,UAAA;;;;2BAPQ,wBAAA,GAA2B,oBAAA;;;;;;eAMvC,IAAA,EAAM,oBAAA;mBACF,UAAA"}
@@ -1,4 +1,5 @@
1
- import { resource, tapEffect, tapEffectEvent, tapState } from "@assistant-ui/tap";
1
+ import { useEffect, useEffectEvent, useState } from "@assistant-ui/tap/react-shim";
2
+ import { resource } from "@assistant-ui/tap";
2
3
  //#region src/primitives/composer/trigger/triggerKeyboardResource.ts
3
4
  /** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */
4
5
  function isTriggerItem(x) {
@@ -8,20 +9,20 @@ function isTriggerItem(x) {
8
9
  * Owns keyboard-driven highlight state for the popover. Delegates selection,
9
10
  * category drill-in, back, and close to the callbacks supplied by the parent.
10
11
  */
11
- const TriggerKeyboardResource = resource(({ navigableList, isSearchMode, activeCategoryId, query, popoverId, open, selectItem, selectCategory, goBack, close }) => {
12
- const [highlightedIndex, setHighlightedIndex] = tapState(0);
13
- tapEffect(() => {
12
+ const TriggerKeyboardResource = resource(function TriggerKeyboardResource({ navigableList, isSearchMode, activeCategoryId, query, popoverId, open, selectItem, selectCategory, goBack, close }) {
13
+ const [highlightedIndex, setHighlightedIndex] = useState(0);
14
+ useEffect(() => {
14
15
  setHighlightedIndex(0);
15
16
  }, [navigableList]);
16
- tapEffect(() => {
17
+ useEffect(() => {
17
18
  setHighlightedIndex(0);
18
19
  }, [isSearchMode, activeCategoryId]);
19
- const highlightIndex = tapEffectEvent((index) => {
20
+ const highlightIndex = useEffectEvent((index) => {
20
21
  if (index < 0 || index >= navigableList.length) return;
21
22
  if (index === highlightedIndex) return;
22
23
  setHighlightedIndex(index);
23
24
  });
24
- const handleKeyDown = tapEffectEvent((e) => {
25
+ const handleKeyDown = useEffectEvent((e) => {
25
26
  if (!open) return false;
26
27
  switch (e.key) {
27
28
  case "ArrowDown":
@@ -1 +1 @@
1
- {"version":3,"file":"triggerKeyboardResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import {\n resource,\n tapEffect,\n tapEffectEvent,\n tapState,\n} from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nexport const TriggerKeyboardResource = resource(\n ({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n }: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n }): TriggerKeyboardResourceOutput => {\n const [highlightedIndex, setHighlightedIndex] = tapState(0);\n\n tapEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n tapEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = tapEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = tapEffectEvent(\n (e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n },\n );\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n },\n);\n"],"mappings":";;;AAYA,SAAS,cACP,GAC2B;CAC3B,OAAO,UAAU;AACnB;;;;;AAwBA,MAAa,0BAA0B,UACpC,EACC,eACA,cACA,kBACA,OACA,WACA,MACA,YACA,gBACA,QACA,YAYmC;CACnC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,CAAC;CAE1D,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,aAAa,CAAC;CAElB,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,cAAc,gBAAgB,CAAC;CAEnC,MAAM,iBAAiB,gBAAgB,UAAkB;EACvD,IAAI,QAAQ,KAAK,SAAS,cAAc,QAAQ;EAChD,IAAI,UAAU,kBAAkB;EAChC,oBAAoB,KAAK;CAC3B,CAAC;CAED,MAAM,gBAAgB,gBACnB,MAAuC;EACtC,IAAI,CAAC,MAAM,OAAO;EAElB,QAAQ,EAAE,KAAV;GACE,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI;IACrC,CAAC;IACD,OAAO;GAET,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,IAAI,OAAO,IAAI,MAAM;IACrC,CAAC;IACD,OAAO;GAET,KAAK;GACL,KAAK,OAAO;IACV,IAAI,EAAE,UAAU,OAAO;IACvB,EAAE,eAAe;IACjB,MAAM,OAAO,cAAc;IAC3B,IAAI,CAAC,MAAM,OAAO;IAElB,IAAI,cAAc,IAAI,GACpB,WAAW,IAAI;SAEf,eAAe,KAAK,EAAE;IAExB,OAAO;GACT;GACA,KAAK;IACH,EAAE,eAAe;IACjB,MAAM;IACN,OAAO;GAET,KAAK;IACH,IAAI,oBAAoB,UAAU,IAAI;KACpC,EAAE,eAAe;KACjB,OAAO;KACP,OAAO;IACT;IACA,OAAO;GAET,SACE,OAAO;EACX;CACF,CACF;CAEA,MAAM,mBAAmB,cAAc;CAMvC,OAAO;EACL;EACA,mBANA,QAAQ,mBACJ,GAAG,UAAU,UAAU,iBAAiB,OACxC,KAAA;EAKJ;EACA;CACF;AACF,CACF"}
1
+ {"version":3,"file":"triggerKeyboardResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nexport const TriggerKeyboardResource = resource(\n function TriggerKeyboardResource({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n }: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n }): TriggerKeyboardResourceOutput {\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = useEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = useEffectEvent(\n (e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n },\n );\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n },\n);\n"],"mappings":";;;;AAQA,SAAS,cACP,GAC2B;CAC3B,OAAO,UAAU;AACnB;;;;;AAwBA,MAAa,0BAA0B,SACrC,SAAS,wBAAwB,EAC/B,eACA,cACA,kBACA,OACA,WACA,MACA,YACA,gBACA,QACA,SAYgC;CAChC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,CAAC;CAE1D,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,aAAa,CAAC;CAElB,gBAAgB;EACd,oBAAoB,CAAC;CACvB,GAAG,CAAC,cAAc,gBAAgB,CAAC;CAEnC,MAAM,iBAAiB,gBAAgB,UAAkB;EACvD,IAAI,QAAQ,KAAK,SAAS,cAAc,QAAQ;EAChD,IAAI,UAAU,kBAAkB;EAChC,oBAAoB,KAAK;CAC3B,CAAC;CAED,MAAM,gBAAgB,gBACnB,MAAuC;EACtC,IAAI,CAAC,MAAM,OAAO;EAElB,QAAQ,EAAE,KAAV;GACE,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI;IACrC,CAAC;IACD,OAAO;GAET,KAAK;IACH,EAAE,eAAe;IACjB,qBAAqB,SAAS;KAC5B,MAAM,MAAM,cAAc;KAC1B,IAAI,QAAQ,GAAG,OAAO;KACtB,OAAO,OAAO,IAAI,OAAO,IAAI,MAAM;IACrC,CAAC;IACD,OAAO;GAET,KAAK;GACL,KAAK,OAAO;IACV,IAAI,EAAE,UAAU,OAAO;IACvB,EAAE,eAAe;IACjB,MAAM,OAAO,cAAc;IAC3B,IAAI,CAAC,MAAM,OAAO;IAElB,IAAI,cAAc,IAAI,GACpB,WAAW,IAAI;SAEf,eAAe,KAAK,EAAE;IAExB,OAAO;GACT;GACA,KAAK;IACH,EAAE,eAAe;IACjB,MAAM;IACN,OAAO;GAET,KAAK;IACH,IAAI,oBAAoB,UAAU,IAAI;KACpC,EAAE,eAAe;KACjB,OAAO;KACP,OAAO;IACT;IACA,OAAO;GAET,SACE,OAAO;EACX;CACF,CACF;CAEA,MAAM,mBAAmB,cAAc;CAMvC,OAAO;EACL;EACA,mBANA,QAAQ,mBACJ,GAAG,UAAU,UAAU,iBAAiB,OACxC,KAAA;EAKJ;EACA;CACF;AACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"triggerNavigationResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"mappings":";;;KAqBY,+BAAA;iFAED,UAAA,WAAqB,wBAAA,IAFW;EAAA,SAIhC,KAAA,WAAgB,oBAAA,IAFK;EAAA,SAIrB,YAAA,WAKL;EAAA,SAHK,gBAAA,iBAIe;EAAA,SAFf,aAAA,YACL,wBAAA,GACA,oBAAA,KAVK;EAaT,cAAA,CAAe,UAAA,iBAXN;EAaT,MAAA;AAAA;;;;;cAOW,yBAAA,GAAyB,KAAA;WAMzB,uBAAA;;;;WAAA,uBAAA"}
1
+ {"version":3,"file":"triggerNavigationResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"mappings":";;;KAgBY,+BAAA;iFAED,UAAA,WAAqB,wBAAA,IAFW;EAAA,SAIhC,KAAA,WAAgB,oBAAA,IAFK;EAAA,SAIrB,YAAA,WAKL;EAAA,SAHK,gBAAA,iBAIe;EAAA,SAFf,aAAA,YACL,wBAAA,GACA,oBAAA,KAVK;EAaT,cAAA,CAAe,UAAA,iBAXN;EAaT,MAAA;AAAA;;;;;cAOW,yBAAA,GAAyB,KAAA;WAMzB,uBAAA;;;;WAAA,uBAAA"}