Usage
The ChatReasoning component renders a collapsible block that displays AI reasoning or thinking content. It auto-opens during streaming and auto-closes after.
Text
Use the text prop to set the reasoning content. The text is displayed inside the collapsible body.
The user is asking about Vue components...
<template>
<B24ChatReasoning text="The user is asking about Vue components..." />
</template>
Streaming
Use the streaming prop to indicate active reasoning. The component auto-opens when streaming starts and auto-closes when it ends.
The user is asking about Vue components...
<template>
<B24ChatReasoning streaming text="The user is asking about Vue components..." />
</template>
Use the
isPartStreaming utility from @bitrix24/b24ui-nuxt/utils/ai to determine if a reasoning part is currently being streamed.Shimmer
When streaming, the trigger label uses the ChatShimmer component. Use the shimmer prop to customize its duration and spread.
The user is asking about Vue components...
<template>
<B24ChatReasoning
streaming
text="The user is asking about Vue components..."
:shimmer="{
duration: 2,
spread: 2
}"
/>
</template>
Icon
Use the icon prop to display an Icon component next to the trigger.
The user is asking about Vue components...
<script setup lang="ts">
import RocketIcon from '@bitrix24/b24icons-vue/main/RocketIcon'
</script>
<template>
<B24ChatReasoning :icon="RocketIcon" text="The user is asking about Vue components..." />
</template>
Chevron
Use the chevron prop to change the position of the chevron icon.
When
chevron is set to leading with an icon, the icon swaps with the chevron on hover and when open.The user is asking about Vue components...
<script setup lang="ts">
import RocketIcon from '@bitrix24/b24icons-vue/main/RocketIcon'
</script>
<template>
<B24ChatReasoning
chevron="leading"
:icon="RocketIcon"
text="The user is asking about Vue components..."
/>
</template>
Chevron Icon
Use the chevron-icon prop to customize the chevron Icon.
The user is asking about Vue components...
<template>
<B24ChatReasoning chevron-icon="function render(_ctx, _cache) {
return (_openBlock(), _createElementBlock("svg", {
xmlns: "http://www.w3.org/2000/svg",
fill: "none",
viewBox: "0 0 24 24",
"aria-hidden": "true",
"data-slot": "icon"
}, [
_createElementVNode("path", {
fill: "currentColor",
"fill-rule": "evenodd",
d: "M8.292 16.885c.99.828 2.158 1.267 3.415 1.153.22.572.598 1.51 1.124 2.643 2.4-1.448 2.743-3.471 2.697-4.683q.354-.353.707-.771c2.881-3.423 3.28-10.079 2.492-10.738-.788-.66-7.295.888-10.176 4.311q-.357.425-.646.837c-1.207.17-3.134.863-4.144 3.459 1.207.318 2.195.526 2.799.643.107 1.25.743 2.32 1.732 3.146m1.718-2.041a2.056 2.056 0 0 0 2.89-.252 2.04 2.04 0 0 0-.252-2.882 2.056 2.056 0 0 0-2.89.252 2.04 2.04 0 0 0 .252 2.882m5.07-4.315a1.104 1.104 0 0 1-1.552.136 1.096 1.096 0 0 1-.136-1.548 1.104 1.104 0 0 1 1.552-.135c.466.39.527 1.083.136 1.547m-5.701 7.974a5.1 5.1 0 0 1-1.75-.933 4.9 4.9 0 0 1-1.267-1.484c-.874 2.119-1.251 3.831-.984 4.045s1.968-.438 4.001-1.628",
"clip-rule": "evenodd"
})
]))
}" text="The user is asking about Vue components..." />
</template>
Examples
API
Props
Slots
Emits
Theme
https://github.com/bitrix24/b24ui/tree/main/src/theme/chat-reasoning.ts
export default {
slots: {
root: '',
trigger: 'group w-full min-w-0 flex items-center gap-1.5 text-muted text-sm disabled:cursor-default disabled:hover:text-muted hover:text-default focus-visible:outline-offset-2 focus-visible:outline-primary transition-colors',
leading: 'relative size-5 shrink-0',
leadingIcon: 'size-5 shrink-0',
chevronIcon: 'size-4 shrink-0 group-data-[state=open]:rotate-180 transition-transform duration-200',
label: 'truncate',
trailingIcon: 'size-4 shrink-0 group-data-[state=open]:rotate-180 transition-transform duration-200',
content: 'motion-safe:data-[state=open]:animate-[collapsible-down_200ms_ease-out] motion-safe:data-[state=closed]:animate-[collapsible-up_200ms_ease-out] overflow-hidden',
body: 'max-h-[200px] pt-2 overflow-y-auto text-sm text-dimmed whitespace-pre-wrap'
},
variants: {
chevron: {
leading: {
leadingIcon: 'group-hover:opacity-0'
},
trailing: ''
},
alone: {
false: {
leadingIcon: 'absolute inset-0 group-data-[state=open]:opacity-0 transition-opacity duration-200',
chevronIcon: 'absolute inset-0 opacity-0 group-hover:opacity-100 group-data-[state=open]:opacity-100 transition-[rotate,opacity] duration-200'
}
}
}
}