@assistant-ui/react 0.12.24 → 0.12.26
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.
- package/dist/augmentations.d.ts.map +1 -1
- package/dist/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/client/InMemoryThreadList.js +1 -0
- package/dist/client/InMemoryThreadList.js.map +1 -1
- package/dist/client/SingleThreadList.d.ts.map +1 -1
- package/dist/client/SingleThreadList.js +1 -0
- package/dist/client/SingleThreadList.js.map +1 -1
- package/dist/context/providers/MessageProvider.d.ts +1 -1
- package/dist/context/providers/MessageProvider.d.ts.map +1 -1
- package/dist/context/react/ThreadViewportContext.d.ts +3 -3
- package/dist/context/react/ThreadViewportContext.d.ts.map +1 -1
- package/dist/context/react/utils/createContextHook.d.ts +1 -1
- package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
- package/dist/context/react/utils/createContextHook.js.map +1 -1
- package/dist/context/react/utils/createContextStoreHook.d.ts +1 -1
- package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.d.ts +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.js +1 -0
- package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
- package/dist/devtools/DevToolsHooks.d.ts +1 -1
- package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
- package/dist/devtools/DevToolsHooks.js +4 -0
- package/dist/devtools/DevToolsHooks.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -32
- package/dist/index.js.map +1 -1
- package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts +3 -3
- package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
- package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
- package/dist/legacy-runtime/cloud/auiV0.d.ts +3 -3
- package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
- package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
- package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -1
- package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/AssistantContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/ComposerContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/MessageContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/ThreadContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
- package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +1 -1
- package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +2 -2
- package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +3 -3
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +14 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
- package/dist/model-context/makeAssistantVisible.d.ts +1 -1
- package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarEdit.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarReload.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarRoot.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarSpeak.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
- package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +1 -1
- package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts +5 -2
- package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js +3 -2
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts +7 -4
- package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js +2 -2
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts +7 -4
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +2 -2
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts +7 -4
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +2 -2
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.d.ts +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +1 -1
- package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
- package/dist/primitives/attachment/AttachmentRemove.d.ts +1 -1
- package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
- package/dist/primitives/attachment/AttachmentRoot.d.ts +1 -1
- package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
- package/dist/primitives/attachment/AttachmentRoot.js +1 -1
- package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
- package/dist/primitives/attachment/AttachmentThumb.d.ts +1 -1
- package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
- package/dist/primitives/attachment/AttachmentThumb.js +1 -1
- package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerNext.d.ts +1 -1
- package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +1 -1
- package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
- package/dist/primitives/composer/ComposerAddAttachment.d.ts +1 -1
- package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +3 -2
- package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
- package/dist/primitives/composer/ComposerCancel.d.ts +1 -1
- package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.d.ts +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.js +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
- package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerInput.js +28 -0
- package/dist/primitives/composer/ComposerInput.js.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts +11 -3
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.js +13 -9
- package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
- package/dist/primitives/composer/ComposerRoot.d.ts +1 -1
- package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerSend.d.ts +1 -1
- package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts +60 -0
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopover.js +108 -0
- package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts +31 -0
- package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +39 -0
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js +3 -3
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +11 -9
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts +28 -0
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +37 -0
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js +9 -6
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +16 -17
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +53 -248
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +60 -0
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +117 -0
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -0
- package/dist/primitives/composer/trigger/detectTrigger.js +1 -1
- package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
- package/dist/primitives/composer/trigger/index.d.ts +16 -3
- package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/index.js +9 -2
- package/dist/primitives/composer/trigger/index.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +22 -0
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/triggerDetectionResource.js +17 -0
- package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -0
- package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +45 -0
- package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js +94 -0
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -0
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +31 -0
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +94 -0
- package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -0
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +42 -0
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +62 -0
- package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -0
- package/dist/primitives/composer.d.ts +8 -13
- package/dist/primitives/composer.d.ts.map +1 -1
- package/dist/primitives/composer.js +7 -17
- package/dist/primitives/composer.js.map +1 -1
- package/dist/primitives/dropdownMenuRenderPrimitives.d.ts +14 -0
- package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -0
- package/dist/primitives/dropdownMenuRenderPrimitives.js +7 -0
- package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -0
- package/dist/primitives/error/ErrorMessage.d.ts +1 -1
- package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
- package/dist/primitives/error/ErrorMessage.js +1 -1
- package/dist/primitives/error/ErrorMessage.js.map +1 -1
- package/dist/primitives/error/ErrorRoot.d.ts +1 -1
- package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
- package/dist/primitives/error/ErrorRoot.js +1 -1
- package/dist/primitives/error/ErrorRoot.js.map +1 -1
- package/dist/primitives/message/MessageError.d.ts +1 -1
- package/dist/primitives/message/MessageError.d.ts.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.d.ts +1 -1
- package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
- package/dist/primitives/message/MessageRoot.d.ts +1 -1
- package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
- package/dist/primitives/messagePart/MessagePartImage.d.ts +1 -1
- package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
- package/dist/primitives/messagePart/MessagePartImage.js +2 -1
- package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
- package/dist/primitives/messagePart/MessagePartInProgress.d.ts +1 -1
- package/dist/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
- package/dist/primitives/messagePart/MessagePartText.d.ts +2 -2
- package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
- package/dist/primitives/queueItem/QueueItemRemove.d.ts +1 -1
- package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
- package/dist/primitives/queueItem/QueueItemSteer.d.ts +1 -1
- package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
- package/dist/primitives/suggestion/SuggestionDescription.d.ts +1 -1
- package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
- package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
- package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
- package/dist/primitives/suggestion/SuggestionTitle.d.ts +1 -1
- package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
- package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
- package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
- package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -1
- package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
- package/dist/primitives/thread/ThreadRoot.d.ts +1 -1
- package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
- package/dist/primitives/thread/ThreadRoot.js +1 -1
- package/dist/primitives/thread/ThreadRoot.js.map +1 -1
- package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -1
- package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
- package/dist/primitives/thread/ThreadSuggestion.d.ts +1 -1
- package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
- package/dist/primitives/thread/ThreadSuggestion.js +0 -2
- package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
- package/dist/primitives/thread/ThreadViewport.d.ts +1 -1
- package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
- package/dist/primitives/thread/ThreadViewportFooter.d.ts +1 -1
- package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
- package/dist/primitives/threadList/ThreadListNew.d.ts +1 -1
- package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
- package/dist/primitives/threadList/ThreadListRoot.d.ts +1 -1
- package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
- package/dist/primitives/threadList/ThreadListRoot.js +1 -1
- package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +1 -1
- package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +1 -1
- package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +1 -1
- package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +5 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +3 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +7 -4
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +2 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +7 -4
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +2 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +7 -4
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +2 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
- package/dist/unstable/useMentionAdapter.d.ts +80 -0
- package/dist/unstable/useMentionAdapter.d.ts.map +1 -0
- package/dist/unstable/useMentionAdapter.js +129 -0
- package/dist/unstable/useMentionAdapter.js.map +1 -0
- package/dist/unstable/useSlashCommandAdapter.d.ts +32 -17
- package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
- package/dist/unstable/useSlashCommandAdapter.js +56 -32
- package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
- package/dist/utils/Primitive.d.ts +6 -4
- package/dist/utils/Primitive.d.ts.map +1 -1
- package/dist/utils/Primitive.js +15 -8
- package/dist/utils/Primitive.js.map +1 -1
- package/dist/utils/createActionButton.d.ts +1 -1
- package/dist/utils/createActionButton.d.ts.map +1 -1
- package/dist/utils/hooks/useManagedRef.d.ts +1 -1
- package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
- package/dist/utils/hooks/useManagedRef.js.map +1 -1
- package/dist/utils/json/is-json.d.ts +1 -1
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/smooth/SmoothContext.d.ts +2 -2
- package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
- package/dist/utils/smooth/SmoothContext.js.map +1 -1
- package/package.json +13 -13
- package/src/augmentations.ts +2 -0
- package/src/client/InMemoryThreadList.ts +1 -0
- package/src/client/SingleThreadList.ts +1 -0
- package/src/context/providers/MessageProvider.tsx +1 -1
- package/src/context/providers/ThreadViewportProvider.tsx +1 -1
- package/src/context/react/ThreadViewportContext.ts +3 -3
- package/src/context/react/utils/createContextHook.ts +1 -1
- package/src/context/react/utils/createContextStoreHook.ts +2 -2
- package/src/context/react/utils/createStateHookForRuntime.ts +2 -1
- package/src/devtools/DevToolsHooks.ts +5 -1
- package/src/index.ts +27 -56
- package/src/legacy-runtime/AssistantRuntimeProvider.tsx +3 -3
- package/src/legacy-runtime/cloud/auiV0.ts +6 -3
- package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +1 -1
- package/src/legacy-runtime/hooks/AssistantContext.ts +1 -1
- package/src/legacy-runtime/hooks/AttachmentContext.ts +1 -1
- package/src/legacy-runtime/hooks/ComposerContext.ts +1 -1
- package/src/legacy-runtime/hooks/MessageContext.ts +1 -1
- package/src/legacy-runtime/hooks/MessagePartContext.ts +1 -1
- package/src/legacy-runtime/hooks/ThreadContext.ts +1 -1
- package/src/legacy-runtime/hooks/ThreadListItemContext.ts +1 -1
- package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +1 -1
- package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +2 -2
- package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +20 -4
- package/src/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.test.ts +8 -2
- package/src/model-context/frame/useAssistantFrameHost.ts +1 -1
- package/src/model-context/makeAssistantVisible.tsx +3 -3
- package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
- package/src/primitives/actionBar/ActionBarEdit.ts +2 -2
- package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
- package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
- package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
- package/src/primitives/actionBar/ActionBarReload.ts +2 -2
- package/src/primitives/actionBar/ActionBarRoot.tsx +1 -1
- package/src/primitives/actionBar/ActionBarSpeak.ts +2 -2
- package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
- package/src/primitives/actionBarMore/ActionBarMoreContent.tsx +10 -4
- package/src/primitives/actionBarMore/ActionBarMoreItem.tsx +7 -7
- package/src/primitives/actionBarMore/ActionBarMoreRoot.tsx +2 -2
- package/src/primitives/actionBarMore/ActionBarMoreSeparator.tsx +7 -5
- package/src/primitives/actionBarMore/ActionBarMoreTrigger.tsx +7 -7
- package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -2
- package/src/primitives/assistantModal/AssistantModalContent.tsx +6 -2
- package/src/primitives/assistantModal/AssistantModalRoot.tsx +2 -2
- package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -2
- package/src/primitives/attachment/AttachmentRemove.ts +2 -2
- package/src/primitives/attachment/AttachmentRoot.tsx +5 -1
- package/src/primitives/attachment/AttachmentThumb.tsx +5 -1
- package/src/primitives/branchPicker/BranchPickerNext.ts +2 -2
- package/src/primitives/branchPicker/BranchPickerPrevious.ts +2 -2
- package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -1
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +2 -2
- package/src/primitives/chainOfThought/ChainOfThoughtRoot.tsx +5 -1
- package/src/primitives/composer/ComposerAddAttachment.ts +2 -2
- package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +125 -0
- package/src/primitives/composer/ComposerAttachmentDropzone.tsx +11 -8
- package/src/primitives/composer/ComposerCancel.ts +2 -2
- package/src/primitives/composer/ComposerDictationTranscript.tsx +5 -1
- package/src/primitives/composer/ComposerInput.tsx +33 -1
- package/src/primitives/composer/ComposerInputPluginContext.tsx +37 -24
- package/src/primitives/composer/ComposerRoot.tsx +1 -1
- package/src/primitives/composer/ComposerSend.ts +2 -2
- package/src/primitives/composer/trigger/TriggerPopover.tsx +207 -0
- package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +61 -0
- package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +4 -3
- package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +14 -17
- package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +57 -0
- package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +44 -40
- package/src/primitives/composer/trigger/TriggerPopoverResource.ts +76 -315
- package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +212 -0
- package/src/primitives/composer/trigger/detectTrigger.test.ts +36 -0
- package/src/primitives/composer/trigger/detectTrigger.ts +1 -1
- package/src/primitives/composer/trigger/index.ts +21 -5
- package/src/primitives/composer/trigger/triggerDetectionResource.ts +43 -0
- package/src/primitives/composer/trigger/triggerKeyboardResource.ts +151 -0
- package/src/primitives/composer/trigger/triggerNavigationResource.ts +145 -0
- package/src/primitives/composer/trigger/triggerSelectionResource.ts +122 -0
- package/src/primitives/composer.ts +8 -18
- package/src/primitives/dropdownMenuRenderPrimitives.test.tsx +64 -0
- package/src/primitives/dropdownMenuRenderPrimitives.ts +15 -0
- package/src/primitives/error/ErrorMessage.tsx +5 -1
- package/src/primitives/error/ErrorRoot.tsx +5 -1
- package/src/primitives/message/MessageError.ts +1 -1
- package/src/primitives/message/MessagePartsGrouped.tsx +1 -1
- package/src/primitives/message/MessageRoot.tsx +1 -1
- package/src/primitives/messagePart/MessagePartImage.tsx +6 -1
- package/src/primitives/messagePart/MessagePartInProgress.ts +1 -1
- package/src/primitives/messagePart/MessagePartText.tsx +3 -3
- package/src/primitives/queueItem/QueueItemRemove.ts +2 -2
- package/src/primitives/queueItem/QueueItemSteer.ts +2 -2
- package/src/primitives/suggestion/SuggestionDescription.tsx +5 -1
- package/src/primitives/suggestion/SuggestionTitle.tsx +5 -1
- package/src/primitives/suggestion/SuggestionTrigger.ts +2 -2
- package/src/primitives/thread/ThreadRoot.tsx +5 -1
- package/src/primitives/thread/ThreadScrollToBottom.ts +2 -2
- package/src/primitives/thread/ThreadSuggestion.ts +2 -4
- package/src/primitives/thread/ThreadViewport.tsx +1 -1
- package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
- package/src/primitives/threadList/ThreadListNew.tsx +1 -1
- package/src/primitives/threadList/ThreadListRoot.tsx +5 -1
- package/src/primitives/threadListItem/ThreadListItemArchive.ts +2 -2
- package/src/primitives/threadListItem/ThreadListItemDelete.ts +2 -2
- package/src/primitives/threadListItem/ThreadListItemRoot.tsx +5 -1
- package/src/primitives/threadListItem/ThreadListItemTrigger.ts +2 -2
- package/src/primitives/threadListItem/ThreadListItemUnarchive.ts +2 -2
- package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +10 -4
- package/src/primitives/threadListItemMore/ThreadListItemMoreItem.tsx +7 -7
- package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +2 -2
- package/src/primitives/threadListItemMore/ThreadListItemMoreSeparator.tsx +7 -5
- package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +7 -7
- package/src/tests/DataRenderers.test.ts +174 -41
- package/src/unstable/useMentionAdapter.ts +220 -0
- package/src/unstable/useSlashCommandAdapter.ts +79 -50
- package/src/utils/Primitive.test.tsx +7 -1
- package/src/utils/Primitive.tsx +49 -16
- package/src/utils/createActionButton.tsx +3 -3
- package/src/utils/hooks/useManagedRef.ts +2 -2
- package/src/utils/json/is-json.ts +1 -1
- package/src/utils/smooth/SmoothContext.tsx +5 -5
- package/dist/primitives/composer/mention/ComposerMentionContext.d.ts +0 -25
- package/dist/primitives/composer/mention/ComposerMentionContext.d.ts.map +0 -1
- package/dist/primitives/composer/mention/ComposerMentionContext.js +0 -74
- package/dist/primitives/composer/mention/ComposerMentionContext.js.map +0 -1
- package/dist/primitives/composer/mention/index.d.ts +0 -6
- package/dist/primitives/composer/mention/index.d.ts.map +0 -1
- package/dist/primitives/composer/mention/index.js +0 -8
- package/dist/primitives/composer/mention/index.js.map +0 -1
- package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts +0 -36
- package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts.map +0 -1
- package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js +0 -36
- package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js.map +0 -1
- package/dist/primitives/composer/slash-command/index.d.ts +0 -2
- package/dist/primitives/composer/slash-command/index.d.ts.map +0 -1
- package/dist/primitives/composer/slash-command/index.js +0 -2
- package/dist/primitives/composer/slash-command/index.js.map +0 -1
- package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts +0 -37
- package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts.map +0 -1
- package/dist/primitives/composer/trigger/TriggerPopoverContext.js +0 -70
- package/dist/primitives/composer/trigger/TriggerPopoverContext.js.map +0 -1
- package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts +0 -26
- package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts.map +0 -1
- package/dist/primitives/composer/trigger/TriggerPopoverPopover.js +0 -28
- package/dist/primitives/composer/trigger/TriggerPopoverPopover.js.map +0 -1
- package/dist/unstable/useToolMentionAdapter.d.ts +0 -42
- package/dist/unstable/useToolMentionAdapter.d.ts.map +0 -1
- package/dist/unstable/useToolMentionAdapter.js +0 -65
- package/dist/unstable/useToolMentionAdapter.js.map +0 -1
- package/src/primitives/composer/mention/ComposerMentionContext.tsx +0 -175
- package/src/primitives/composer/mention/index.ts +0 -19
- package/src/primitives/composer/slash-command/ComposerSlashCommandRoot.tsx +0 -76
- package/src/primitives/composer/slash-command/index.ts +0 -1
- package/src/primitives/composer/trigger/TriggerPopoverContext.tsx +0 -129
- package/src/primitives/composer/trigger/TriggerPopoverPopover.tsx +0 -51
- package/src/unstable/useToolMentionAdapter.ts +0 -114
|
@@ -1,58 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
resource,
|
|
3
|
-
tapState,
|
|
4
|
-
tapMemo,
|
|
5
|
-
tapEffectEvent,
|
|
6
|
-
tapEffect,
|
|
7
|
-
tapRef,
|
|
8
|
-
} from "@assistant-ui/tap";
|
|
1
|
+
import { resource, tapEffectEvent, tapResource } from "@assistant-ui/tap";
|
|
9
2
|
import type {
|
|
10
3
|
Unstable_TriggerAdapter,
|
|
11
4
|
Unstable_TriggerCategory,
|
|
12
5
|
Unstable_TriggerItem,
|
|
13
|
-
Unstable_DirectiveFormatter,
|
|
14
6
|
} from "@assistant-ui/core";
|
|
15
7
|
import type { AssistantClient } from "@assistant-ui/store";
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
function matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {
|
|
25
|
-
return (
|
|
26
|
-
item.id.toLowerCase().includes(lower) ||
|
|
27
|
-
item.label.toLowerCase().includes(lower) ||
|
|
28
|
-
(item.description?.toLowerCase().includes(lower) ?? false)
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// =============================================================================
|
|
33
|
-
// Types
|
|
34
|
-
// =============================================================================
|
|
35
|
-
|
|
36
|
-
export type TriggerPopoverKeyEvent = {
|
|
37
|
-
readonly key: string;
|
|
38
|
-
readonly shiftKey: boolean;
|
|
39
|
-
preventDefault(): void;
|
|
40
|
-
};
|
|
8
|
+
import { TriggerDetectionResource } from "./triggerDetectionResource";
|
|
9
|
+
import { TriggerKeyboardResource } from "./triggerKeyboardResource";
|
|
10
|
+
import { TriggerNavigationResource } from "./triggerNavigationResource";
|
|
11
|
+
import {
|
|
12
|
+
TriggerSelectionResource,
|
|
13
|
+
type SelectItemOverride,
|
|
14
|
+
type TriggerBehavior,
|
|
15
|
+
} from "./triggerSelectionResource";
|
|
41
16
|
|
|
42
|
-
export type SelectItemOverride
|
|
17
|
+
export type { SelectItemOverride, TriggerBehavior };
|
|
18
|
+
export type { TriggerPopoverKeyEvent } from "./triggerKeyboardResource";
|
|
43
19
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
type: "insertDirective";
|
|
47
|
-
formatter: Unstable_DirectiveFormatter;
|
|
48
|
-
}
|
|
49
|
-
| {
|
|
50
|
-
type: "action";
|
|
51
|
-
handler: (item: Unstable_TriggerItem) => void;
|
|
52
|
-
};
|
|
20
|
+
/** @deprecated Use `TriggerBehavior`. */
|
|
21
|
+
export type OnSelectBehavior = TriggerBehavior;
|
|
53
22
|
|
|
54
23
|
export type TriggerPopoverResourceOutput = {
|
|
55
|
-
// State
|
|
56
24
|
readonly open: boolean;
|
|
57
25
|
readonly query: string;
|
|
58
26
|
readonly activeCategoryId: string | null;
|
|
@@ -65,312 +33,105 @@ export type TriggerPopoverResourceOutput = {
|
|
|
65
33
|
/** ID of the currently highlighted item (for aria-activedescendant). */
|
|
66
34
|
readonly highlightedItemId: string | undefined;
|
|
67
35
|
|
|
68
|
-
// Actions
|
|
69
36
|
selectCategory(categoryId: string): void;
|
|
70
37
|
goBack(): void;
|
|
71
38
|
selectItem(item: Unstable_TriggerItem): void;
|
|
72
39
|
close(): void;
|
|
73
|
-
|
|
40
|
+
/** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */
|
|
41
|
+
highlightIndex(index: number): void;
|
|
42
|
+
handleKeyDown(e: {
|
|
43
|
+
readonly key: string;
|
|
44
|
+
readonly shiftKey: boolean;
|
|
45
|
+
preventDefault(): void;
|
|
46
|
+
}): boolean;
|
|
74
47
|
|
|
75
|
-
// Internal (for ComposerInput integration)
|
|
76
48
|
setCursorPosition(pos: number): void;
|
|
77
49
|
registerSelectItemOverride(fn: SelectItemOverride): () => void;
|
|
78
50
|
};
|
|
79
51
|
|
|
80
|
-
|
|
81
|
-
// Resource
|
|
82
|
-
// =============================================================================
|
|
83
|
-
|
|
52
|
+
/** Composes detection, navigation, keyboard, and selection sub-resources. */
|
|
84
53
|
export const TriggerPopoverResource = resource(
|
|
85
54
|
({
|
|
86
55
|
adapter,
|
|
87
56
|
text,
|
|
88
57
|
triggerChar,
|
|
89
|
-
|
|
58
|
+
behavior,
|
|
90
59
|
aui,
|
|
91
60
|
popoverId,
|
|
92
61
|
}: {
|
|
93
62
|
adapter: Unstable_TriggerAdapter | undefined;
|
|
94
63
|
text: string;
|
|
95
64
|
triggerChar: string;
|
|
96
|
-
|
|
65
|
+
behavior: TriggerBehavior | undefined;
|
|
97
66
|
aui: AssistantClient;
|
|
98
67
|
/** Stable ID for accessible element IDs (pass React's useId() from component layer). */
|
|
99
68
|
popoverId: string;
|
|
100
69
|
}): TriggerPopoverResourceOutput => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
// -------------------------------------------------------------------------
|
|
104
|
-
|
|
105
|
-
const [cursorPosition, setCursorPosition] = tapState(text.length);
|
|
106
|
-
|
|
107
|
-
const trigger = tapMemo(() => {
|
|
108
|
-
const pos = Math.min(cursorPosition, text.length);
|
|
109
|
-
return detectTrigger(text, triggerChar, pos);
|
|
110
|
-
}, [cursorPosition, text, triggerChar]);
|
|
111
|
-
|
|
112
|
-
const open = trigger !== null && adapter !== undefined;
|
|
113
|
-
const query = trigger?.query ?? "";
|
|
114
|
-
|
|
115
|
-
// -------------------------------------------------------------------------
|
|
116
|
-
// Category navigation
|
|
117
|
-
// -------------------------------------------------------------------------
|
|
118
|
-
|
|
119
|
-
const [activeCategoryId, setActiveCategoryId] = tapState<string | null>(
|
|
120
|
-
null,
|
|
70
|
+
const detection = tapResource(
|
|
71
|
+
TriggerDetectionResource({ text, triggerChar }),
|
|
121
72
|
);
|
|
122
73
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// -------------------------------------------------------------------------
|
|
136
|
-
// Items + search
|
|
137
|
-
// -------------------------------------------------------------------------
|
|
138
|
-
|
|
139
|
-
const allItems = tapMemo<readonly Unstable_TriggerItem[]>(() => {
|
|
140
|
-
if (!effectiveActiveCategoryId || !adapter) return [];
|
|
141
|
-
return adapter.categoryItems(effectiveActiveCategoryId);
|
|
142
|
-
}, [effectiveActiveCategoryId, adapter]);
|
|
143
|
-
|
|
144
|
-
const searchResults = tapMemo<
|
|
145
|
-
readonly Unstable_TriggerItem[] | null
|
|
146
|
-
>(() => {
|
|
147
|
-
if (!open || !adapter || effectiveActiveCategoryId) return null;
|
|
148
|
-
// If categories exist and query is empty, show categories first (not search)
|
|
149
|
-
if (!query && categories.length > 0) return null;
|
|
150
|
-
if (adapter.search) return adapter.search(query);
|
|
151
|
-
|
|
152
|
-
// Fallback: search all categories manually (reuse already-computed list)
|
|
153
|
-
const all: Unstable_TriggerItem[] = [];
|
|
154
|
-
const lower = query.toLowerCase();
|
|
155
|
-
for (const cat of categories) {
|
|
156
|
-
for (const item of adapter.categoryItems(cat.id)) {
|
|
157
|
-
if (matchesQuery(item, lower)) {
|
|
158
|
-
all.push(item);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return all;
|
|
163
|
-
}, [open, adapter, query, effectiveActiveCategoryId, categories]);
|
|
164
|
-
|
|
165
|
-
const isSearchMode = searchResults !== null;
|
|
166
|
-
|
|
167
|
-
// -------------------------------------------------------------------------
|
|
168
|
-
// Filtering
|
|
169
|
-
// -------------------------------------------------------------------------
|
|
170
|
-
|
|
171
|
-
const filteredCategories = tapMemo(() => {
|
|
172
|
-
if (isSearchMode) return [];
|
|
173
|
-
if (!query) return categories;
|
|
174
|
-
const lower = query.toLowerCase();
|
|
175
|
-
return categories.filter((cat) =>
|
|
176
|
-
cat.label.toLowerCase().includes(lower),
|
|
177
|
-
);
|
|
178
|
-
}, [categories, query, isSearchMode]);
|
|
179
|
-
|
|
180
|
-
const filteredItems = tapMemo(() => {
|
|
181
|
-
if (isSearchMode) return searchResults ?? [];
|
|
182
|
-
if (!query) return allItems;
|
|
183
|
-
const lower = query.toLowerCase();
|
|
184
|
-
return allItems.filter((item) => matchesQuery(item, lower));
|
|
185
|
-
}, [allItems, query, isSearchMode, searchResults]);
|
|
186
|
-
|
|
187
|
-
// -------------------------------------------------------------------------
|
|
188
|
-
// Keyboard navigation
|
|
189
|
-
// -------------------------------------------------------------------------
|
|
190
|
-
|
|
191
|
-
const [highlightedIndex, setHighlightedIndex] = tapState(0);
|
|
192
|
-
|
|
193
|
-
const navigableList = tapMemo(() => {
|
|
194
|
-
if (isSearchMode) return searchResults ?? [];
|
|
195
|
-
if (effectiveActiveCategoryId) return filteredItems;
|
|
196
|
-
return filteredCategories;
|
|
197
|
-
}, [
|
|
198
|
-
isSearchMode,
|
|
199
|
-
searchResults,
|
|
200
|
-
effectiveActiveCategoryId,
|
|
201
|
-
filteredItems,
|
|
202
|
-
filteredCategories,
|
|
203
|
-
]);
|
|
204
|
-
|
|
205
|
-
// Reset highlight when list changes
|
|
206
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: intentional reset on list change
|
|
207
|
-
tapEffect(() => {
|
|
208
|
-
setHighlightedIndex(0);
|
|
209
|
-
}, [navigableList]);
|
|
210
|
-
|
|
211
|
-
// -------------------------------------------------------------------------
|
|
212
|
-
// Select-item override (for Lexical integration)
|
|
213
|
-
// -------------------------------------------------------------------------
|
|
214
|
-
|
|
215
|
-
const selectItemOverrideRef = tapRef<SelectItemOverride | null>(null);
|
|
216
|
-
|
|
217
|
-
const registerSelectItemOverride = tapEffectEvent(
|
|
218
|
-
(fn: SelectItemOverride) => {
|
|
219
|
-
selectItemOverrideRef.current = fn;
|
|
220
|
-
return () => {
|
|
221
|
-
if (selectItemOverrideRef.current === fn) {
|
|
222
|
-
selectItemOverrideRef.current = null;
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
},
|
|
74
|
+
const open =
|
|
75
|
+
detection.trigger !== null &&
|
|
76
|
+
adapter !== undefined &&
|
|
77
|
+
behavior !== undefined;
|
|
78
|
+
|
|
79
|
+
const navigation = tapResource(
|
|
80
|
+
TriggerNavigationResource({
|
|
81
|
+
adapter,
|
|
82
|
+
query: detection.query,
|
|
83
|
+
open,
|
|
84
|
+
}),
|
|
226
85
|
);
|
|
227
86
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
// -------------------------------------------------------------------------
|
|
231
|
-
|
|
232
|
-
const selectCategory = tapEffectEvent((categoryId: string) => {
|
|
233
|
-
setActiveCategoryId(categoryId);
|
|
234
|
-
setHighlightedIndex(0);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
const goBack = tapEffectEvent(() => {
|
|
238
|
-
setActiveCategoryId(null);
|
|
239
|
-
setHighlightedIndex(0);
|
|
87
|
+
const onSelected = tapEffectEvent(() => {
|
|
88
|
+
navigation.goBack();
|
|
240
89
|
});
|
|
241
90
|
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Behavior depends on the onSelect configuration
|
|
253
|
-
if (onSelect.type === "insertDirective") {
|
|
254
|
-
// Insert directive text (mention path)
|
|
255
|
-
const currentText = aui.composer().getState().text;
|
|
256
|
-
const before = currentText.slice(0, trigger.offset);
|
|
257
|
-
const after = currentText.slice(
|
|
258
|
-
trigger.offset + triggerChar.length + trigger.query.length,
|
|
259
|
-
);
|
|
260
|
-
const directive = onSelect.formatter.serialize(item);
|
|
261
|
-
const newText =
|
|
262
|
-
before + directive + (after.startsWith(" ") ? after : ` ${after}`);
|
|
263
|
-
|
|
264
|
-
aui.composer().setText(newText);
|
|
265
|
-
} else if (onSelect.type === "action") {
|
|
266
|
-
// Execute action + clear trigger text (slash command path)
|
|
267
|
-
const currentText = aui.composer().getState().text;
|
|
268
|
-
const before = currentText.slice(0, trigger.offset);
|
|
269
|
-
const after = currentText.slice(
|
|
270
|
-
trigger.offset + triggerChar.length + trigger.query.length,
|
|
271
|
-
);
|
|
272
|
-
const newText = before + after.trimStart();
|
|
273
|
-
aui.composer().setText(newText);
|
|
274
|
-
|
|
275
|
-
onSelect.handler(item);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
setActiveCategoryId(null);
|
|
279
|
-
setHighlightedIndex(0);
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
const close = tapEffectEvent(() => {
|
|
283
|
-
setActiveCategoryId(null);
|
|
284
|
-
setHighlightedIndex(0);
|
|
285
|
-
// Move cursor before the trigger so trigger detection deactivates
|
|
286
|
-
if (trigger) {
|
|
287
|
-
setCursorPosition(trigger.offset);
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
const handleKeyDown = tapEffectEvent(
|
|
292
|
-
(e: TriggerPopoverKeyEvent): boolean => {
|
|
293
|
-
if (!open) return false;
|
|
294
|
-
|
|
295
|
-
switch (e.key) {
|
|
296
|
-
case "ArrowDown": {
|
|
297
|
-
e.preventDefault();
|
|
298
|
-
setHighlightedIndex((prev) => {
|
|
299
|
-
const len = navigableList.length;
|
|
300
|
-
if (len === 0) return 0;
|
|
301
|
-
return prev < len - 1 ? prev + 1 : 0;
|
|
302
|
-
});
|
|
303
|
-
return true;
|
|
304
|
-
}
|
|
305
|
-
case "ArrowUp": {
|
|
306
|
-
e.preventDefault();
|
|
307
|
-
setHighlightedIndex((prev) => {
|
|
308
|
-
const len = navigableList.length;
|
|
309
|
-
if (len === 0) return 0;
|
|
310
|
-
return prev > 0 ? prev - 1 : len - 1;
|
|
311
|
-
});
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
case "Enter": {
|
|
315
|
-
if (e.shiftKey) return false;
|
|
316
|
-
e.preventDefault();
|
|
317
|
-
const item = navigableList[highlightedIndex];
|
|
318
|
-
if (!item) return true;
|
|
319
|
-
|
|
320
|
-
if (isTriggerItem(item)) {
|
|
321
|
-
selectItem(item);
|
|
322
|
-
} else {
|
|
323
|
-
selectCategory(item.id);
|
|
324
|
-
}
|
|
325
|
-
return true;
|
|
326
|
-
}
|
|
327
|
-
case "Escape": {
|
|
328
|
-
e.preventDefault();
|
|
329
|
-
close();
|
|
330
|
-
return true;
|
|
331
|
-
}
|
|
332
|
-
case "Backspace": {
|
|
333
|
-
if (effectiveActiveCategoryId && query === "") {
|
|
334
|
-
e.preventDefault();
|
|
335
|
-
goBack();
|
|
336
|
-
return true;
|
|
337
|
-
}
|
|
338
|
-
return false;
|
|
339
|
-
}
|
|
340
|
-
default:
|
|
341
|
-
return false;
|
|
342
|
-
}
|
|
343
|
-
},
|
|
91
|
+
const selection = tapResource(
|
|
92
|
+
TriggerSelectionResource({
|
|
93
|
+
behavior,
|
|
94
|
+
trigger: detection.trigger,
|
|
95
|
+
aui,
|
|
96
|
+
triggerChar,
|
|
97
|
+
setCursorPosition: detection.setCursorPosition,
|
|
98
|
+
onSelected,
|
|
99
|
+
}),
|
|
344
100
|
);
|
|
345
101
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
:
|
|
102
|
+
const keyboard = tapResource(
|
|
103
|
+
TriggerKeyboardResource({
|
|
104
|
+
navigableList: navigation.navigableList,
|
|
105
|
+
isSearchMode: navigation.isSearchMode,
|
|
106
|
+
activeCategoryId: navigation.activeCategoryId,
|
|
107
|
+
query: detection.query,
|
|
108
|
+
popoverId,
|
|
109
|
+
open,
|
|
110
|
+
selectItem: selection.selectItem,
|
|
111
|
+
selectCategory: navigation.selectCategory,
|
|
112
|
+
goBack: navigation.goBack,
|
|
113
|
+
close: selection.close,
|
|
114
|
+
}),
|
|
115
|
+
);
|
|
356
116
|
|
|
357
117
|
return {
|
|
358
118
|
open,
|
|
359
|
-
query,
|
|
360
|
-
activeCategoryId:
|
|
361
|
-
categories:
|
|
362
|
-
items:
|
|
363
|
-
highlightedIndex,
|
|
364
|
-
isSearchMode,
|
|
119
|
+
query: detection.query,
|
|
120
|
+
activeCategoryId: navigation.activeCategoryId,
|
|
121
|
+
categories: navigation.categories,
|
|
122
|
+
items: navigation.items,
|
|
123
|
+
highlightedIndex: keyboard.highlightedIndex,
|
|
124
|
+
isSearchMode: navigation.isSearchMode,
|
|
365
125
|
popoverId,
|
|
366
|
-
highlightedItemId,
|
|
367
|
-
selectCategory,
|
|
368
|
-
goBack,
|
|
369
|
-
selectItem,
|
|
370
|
-
close,
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
126
|
+
highlightedItemId: keyboard.highlightedItemId,
|
|
127
|
+
selectCategory: navigation.selectCategory,
|
|
128
|
+
goBack: navigation.goBack,
|
|
129
|
+
selectItem: selection.selectItem,
|
|
130
|
+
close: selection.close,
|
|
131
|
+
highlightIndex: keyboard.highlightIndex,
|
|
132
|
+
handleKeyDown: keyboard.handleKeyDown,
|
|
133
|
+
setCursorPosition: detection.setCursorPosition,
|
|
134
|
+
registerSelectItemOverride: selection.registerSelectItemOverride,
|
|
374
135
|
};
|
|
375
136
|
},
|
|
376
137
|
);
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useCallback,
|
|
6
|
+
useContext,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useSyncExternalStore,
|
|
10
|
+
type FC,
|
|
11
|
+
type ReactNode,
|
|
12
|
+
} from "react";
|
|
13
|
+
import {
|
|
14
|
+
ComposerInputPluginProvider,
|
|
15
|
+
useComposerInputPluginRegistryOptional,
|
|
16
|
+
} from "../ComposerInputPluginContext";
|
|
17
|
+
import type { TriggerPopoverResourceOutput } from "./TriggerPopoverResource";
|
|
18
|
+
import type { TriggerBehavior } from "./triggerSelectionResource";
|
|
19
|
+
|
|
20
|
+
export type RegisteredTrigger = {
|
|
21
|
+
readonly char: string;
|
|
22
|
+
/** Behavior contributed by a child `TriggerPopover.Directive` / `.Action`. */
|
|
23
|
+
readonly behavior?: TriggerBehavior;
|
|
24
|
+
readonly resource: TriggerPopoverResourceOutput;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type TriggerPopoverLifecycleListener = {
|
|
28
|
+
added(trigger: RegisteredTrigger): void;
|
|
29
|
+
removed(char: string): void;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type TriggerPopoverRootContextValue = {
|
|
33
|
+
register(trigger: RegisteredTrigger): () => void;
|
|
34
|
+
getTriggers(): ReadonlyMap<string, RegisteredTrigger>;
|
|
35
|
+
subscribe(listener: () => void): () => void;
|
|
36
|
+
/** Subscribe to per-trigger add/remove events. */
|
|
37
|
+
subscribeLifecycle(listener: TriggerPopoverLifecycleListener): () => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const TriggerPopoverRootContext =
|
|
41
|
+
createContext<TriggerPopoverRootContextValue | null>(null);
|
|
42
|
+
|
|
43
|
+
export const useTriggerPopoverRootContext = () => {
|
|
44
|
+
const ctx = useContext(TriggerPopoverRootContext);
|
|
45
|
+
if (!ctx)
|
|
46
|
+
throw new Error(
|
|
47
|
+
"useTriggerPopoverRootContext must be used within ComposerPrimitive.TriggerPopoverRoot",
|
|
48
|
+
);
|
|
49
|
+
return ctx;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const useTriggerPopoverRootContextOptional = () =>
|
|
53
|
+
useContext(TriggerPopoverRootContext);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Live map of registered triggers, re-rendering on change. Prefer
|
|
57
|
+
* `subscribeLifecycle` for incremental add/remove handling.
|
|
58
|
+
*/
|
|
59
|
+
export const useTriggerPopoverTriggers = () => {
|
|
60
|
+
const ctx = useTriggerPopoverRootContext();
|
|
61
|
+
return useSyncExternalStore(ctx.subscribe, ctx.getTriggers, ctx.getTriggers);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const EMPTY_TRIGGERS: ReadonlyMap<string, RegisteredTrigger> = new Map();
|
|
65
|
+
const noopSubscribe = () => () => {};
|
|
66
|
+
const getEmptyTriggers = () => EMPTY_TRIGGERS;
|
|
67
|
+
|
|
68
|
+
/** Like `useTriggerPopoverTriggers` but returns an empty map outside a root. */
|
|
69
|
+
export const useTriggerPopoverTriggersOptional = () => {
|
|
70
|
+
const ctx = useTriggerPopoverRootContextOptional();
|
|
71
|
+
return useSyncExternalStore(
|
|
72
|
+
ctx ? ctx.subscribe : noopSubscribe,
|
|
73
|
+
ctx ? ctx.getTriggers : getEmptyTriggers,
|
|
74
|
+
ctx ? ctx.getTriggers : getEmptyTriggers,
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export namespace ComposerPrimitiveTriggerPopoverRoot {
|
|
79
|
+
export type Props = {
|
|
80
|
+
children: ReactNode;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const TriggerPopoverRootInner: FC<
|
|
85
|
+
ComposerPrimitiveTriggerPopoverRoot.Props
|
|
86
|
+
> = ({ children }) => {
|
|
87
|
+
const triggersRef = useRef<ReadonlyMap<string, RegisteredTrigger>>(new Map());
|
|
88
|
+
const listenersRef = useRef<Set<() => void>>(new Set());
|
|
89
|
+
const lifecycleListenersRef = useRef<Set<TriggerPopoverLifecycleListener>>(
|
|
90
|
+
new Set(),
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const notify = useCallback(() => {
|
|
94
|
+
for (const listener of listenersRef.current) listener();
|
|
95
|
+
}, []);
|
|
96
|
+
|
|
97
|
+
const register = useCallback<TriggerPopoverRootContextValue["register"]>(
|
|
98
|
+
(trigger) => {
|
|
99
|
+
const { char } = trigger;
|
|
100
|
+
if (triggersRef.current.has(char)) {
|
|
101
|
+
if (process.env.NODE_ENV !== "production") {
|
|
102
|
+
console.warn(
|
|
103
|
+
`[assistant-ui] Duplicate TriggerPopover for char "${char}". Ignoring the second registration.`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
return () => {};
|
|
107
|
+
}
|
|
108
|
+
if (process.env.NODE_ENV !== "production") {
|
|
109
|
+
for (const existing of triggersRef.current.values()) {
|
|
110
|
+
if (
|
|
111
|
+
char.startsWith(existing.char) ||
|
|
112
|
+
existing.char.startsWith(char)
|
|
113
|
+
) {
|
|
114
|
+
console.warn(
|
|
115
|
+
`[assistant-ui] Trigger prefix collision between "${existing.char}" and "${char}". One char is a prefix of the other; only one will match reliably.`,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const next = new Map(triggersRef.current);
|
|
121
|
+
next.set(char, trigger);
|
|
122
|
+
triggersRef.current = next;
|
|
123
|
+
notify();
|
|
124
|
+
for (const l of lifecycleListenersRef.current) l.added(trigger);
|
|
125
|
+
return () => {
|
|
126
|
+
const after = new Map(triggersRef.current);
|
|
127
|
+
after.delete(char);
|
|
128
|
+
triggersRef.current = after;
|
|
129
|
+
notify();
|
|
130
|
+
for (const l of lifecycleListenersRef.current) l.removed(char);
|
|
131
|
+
};
|
|
132
|
+
},
|
|
133
|
+
[notify],
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const getTriggers = useCallback<
|
|
137
|
+
TriggerPopoverRootContextValue["getTriggers"]
|
|
138
|
+
>(() => triggersRef.current, []);
|
|
139
|
+
|
|
140
|
+
const subscribe = useCallback<TriggerPopoverRootContextValue["subscribe"]>(
|
|
141
|
+
(listener) => {
|
|
142
|
+
listenersRef.current.add(listener);
|
|
143
|
+
return () => {
|
|
144
|
+
listenersRef.current.delete(listener);
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
[],
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const subscribeLifecycle = useCallback<
|
|
151
|
+
TriggerPopoverRootContextValue["subscribeLifecycle"]
|
|
152
|
+
>((listener) => {
|
|
153
|
+
lifecycleListenersRef.current.add(listener);
|
|
154
|
+
return () => {
|
|
155
|
+
lifecycleListenersRef.current.delete(listener);
|
|
156
|
+
};
|
|
157
|
+
}, []);
|
|
158
|
+
|
|
159
|
+
const value = useMemo<TriggerPopoverRootContextValue>(
|
|
160
|
+
() => ({ register, getTriggers, subscribe, subscribeLifecycle }),
|
|
161
|
+
[register, getTriggers, subscribe, subscribeLifecycle],
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<TriggerPopoverRootContext.Provider value={value}>
|
|
166
|
+
{children}
|
|
167
|
+
</TriggerPopoverRootContext.Provider>
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Provider that groups one or more `TriggerPopover` declarations. Each trigger
|
|
173
|
+
* is identified by its `char` (unique within the root). Behavior is contributed
|
|
174
|
+
* by a child `TriggerPopover.Directive` or `TriggerPopover.Action`.
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```tsx
|
|
178
|
+
* <ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
179
|
+
* <ComposerPrimitive.Unstable_TriggerPopover char="@" adapter={mentionAdapter}>
|
|
180
|
+
* <ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
181
|
+
* ...
|
|
182
|
+
* </ComposerPrimitive.Unstable_TriggerPopover>
|
|
183
|
+
*
|
|
184
|
+
* <ComposerPrimitive.Unstable_TriggerPopover char="/" adapter={slashAdapter}>
|
|
185
|
+
* <ComposerPrimitive.Unstable_TriggerPopover.Action onExecute={handler} />
|
|
186
|
+
* ...
|
|
187
|
+
* </ComposerPrimitive.Unstable_TriggerPopover>
|
|
188
|
+
*
|
|
189
|
+
* <ComposerPrimitive.Root>
|
|
190
|
+
* <ComposerPrimitive.Input />
|
|
191
|
+
* </ComposerPrimitive.Root>
|
|
192
|
+
* </ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export const ComposerPrimitiveTriggerPopoverRoot: FC<
|
|
196
|
+
ComposerPrimitiveTriggerPopoverRoot.Props
|
|
197
|
+
> = ({ children }) => {
|
|
198
|
+
const existingRegistry = useComposerInputPluginRegistryOptional();
|
|
199
|
+
|
|
200
|
+
if (existingRegistry) {
|
|
201
|
+
return <TriggerPopoverRootInner>{children}</TriggerPopoverRootInner>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return (
|
|
205
|
+
<ComposerInputPluginProvider>
|
|
206
|
+
<TriggerPopoverRootInner>{children}</TriggerPopoverRootInner>
|
|
207
|
+
</ComposerInputPluginProvider>
|
|
208
|
+
);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
ComposerPrimitiveTriggerPopoverRoot.displayName =
|
|
212
|
+
"ComposerPrimitive.TriggerPopoverRoot";
|
|
@@ -75,4 +75,40 @@ describe("detectTrigger", () => {
|
|
|
75
75
|
offset: 6,
|
|
76
76
|
});
|
|
77
77
|
});
|
|
78
|
+
|
|
79
|
+
it("treats U+3000 full-width space before trigger as boundary", () => {
|
|
80
|
+
expect(detectTrigger("全角\u3000@foo", "@", 7)).toEqual({
|
|
81
|
+
query: "foo",
|
|
82
|
+
offset: 3,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("treats U+00A0 NBSP before trigger as boundary", () => {
|
|
87
|
+
expect(detectTrigger("x\u00A0@foo", "@", 6)).toEqual({
|
|
88
|
+
query: "foo",
|
|
89
|
+
offset: 2,
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("stops at U+3000 full-width space inside query", () => {
|
|
94
|
+
expect(detectTrigger("@foo\u3000bar", "@", 8)).toBeNull();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("IME full-width space before trigger char acts as boundary", () => {
|
|
98
|
+
expect(detectTrigger("hello\u3000@foo", "@", 10)).toEqual({
|
|
99
|
+
query: "foo",
|
|
100
|
+
offset: 6,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("NBSP between word and trigger acts as boundary", () => {
|
|
105
|
+
expect(detectTrigger("hello\u00a0@foo", "@", 10)).toEqual({
|
|
106
|
+
query: "foo",
|
|
107
|
+
offset: 6,
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("full-width trigger char does NOT match ASCII trigger (literal comparison)", () => {
|
|
112
|
+
expect(detectTrigger("hello \uff20foo", "@", 10)).toBeNull();
|
|
113
|
+
});
|
|
78
114
|
});
|