@assistant-ui/mcp-docs-server 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -43
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -91
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +76 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +9 -13
- package/src/index.ts +3 -115
- package/src/proxy.test.ts +250 -0
- package/src/proxy.ts +111 -0
- package/.docs/organized/code-examples/waterfall.md +0 -807
- package/.docs/organized/code-examples/with-a2a.md +0 -674
- package/.docs/organized/code-examples/with-ag-ui.md +0 -552
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -465
- package/.docs/organized/code-examples/with-artifacts.md +0 -814
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -575
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -960
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -438
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -568
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -526
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -696
- package/.docs/organized/code-examples/with-eve.md +0 -404
- package/.docs/organized/code-examples/with-expo.md +0 -2063
- package/.docs/organized/code-examples/with-external-store.md +0 -420
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -828
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1812
- package/.docs/organized/code-examples/with-google-adk.md +0 -367
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -462
- package/.docs/organized/code-examples/with-interactables.md +0 -732
- package/.docs/organized/code-examples/with-langchain.md +0 -445
- package/.docs/organized/code-examples/with-langgraph.md +0 -854
- package/.docs/organized/code-examples/with-livekit.md +0 -642
- package/.docs/organized/code-examples/with-mcp.md +0 -780
- package/.docs/organized/code-examples/with-nuxt.md +0 -2428
- package/.docs/organized/code-examples/with-opencode.md +0 -1974
- package/.docs/organized/code-examples/with-openui.md +0 -449
- package/.docs/organized/code-examples/with-pi.md +0 -2083
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -724
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -690
- package/.docs/organized/code-examples/with-react-ink.md +0 -472
- package/.docs/organized/code-examples/with-react-router.md +0 -935
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -667
- package/.docs/organized/code-examples/with-store.md +0 -679
- package/.docs/organized/code-examples/with-svelte.md +0 -415
- package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
- package/.docs/organized/code-examples/with-tanstack.md +0 -811
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -812
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -680
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(docs)/architecture.mdx +0 -146
- package/.docs/raw/docs/(docs)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(docs)/cli.mdx +0 -542
- package/.docs/raw/docs/(docs)/devtools.mdx +0 -79
- package/.docs/raw/docs/(docs)/index.mdx +0 -21
- package/.docs/raw/docs/(docs)/installation.mdx +0 -483
- package/.docs/raw/docs/(docs)/llm.mdx +0 -211
- package/.docs/raw/docs/(docs)/rtl.mdx +0 -78
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -52
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +0 -200
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -619
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -149
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
- package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -602
- package/.docs/raw/docs/cloud/authorization.mdx +0 -252
- package/.docs/raw/docs/cloud/index.mdx +0 -46
- package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
- package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -400
- package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
- package/.docs/raw/docs/copilots/model-context.mdx +0 -156
- package/.docs/raw/docs/copilots/motivation.mdx +0 -202
- package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
- package/.docs/raw/docs/guides/attachments.mdx +0 -619
- package/.docs/raw/docs/guides/branching.mdx +0 -76
- package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
- package/.docs/raw/docs/guides/context-api.mdx +0 -619
- package/.docs/raw/docs/guides/dictation.mdx +0 -298
- package/.docs/raw/docs/guides/editing.mdx +0 -102
- package/.docs/raw/docs/guides/electron.mdx +0 -369
- package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
- package/.docs/raw/docs/guides/image-generation.mdx +0 -74
- package/.docs/raw/docs/guides/index.mdx +0 -117
- package/.docs/raw/docs/guides/input-history.mdx +0 -55
- package/.docs/raw/docs/guides/latex.mdx +0 -158
- package/.docs/raw/docs/guides/mentions.mdx +0 -575
- package/.docs/raw/docs/guides/message-timing.mdx +0 -209
- package/.docs/raw/docs/guides/quoting.mdx +0 -169
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
- package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
- package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
- package/.docs/raw/docs/guides/speech.mdx +0 -172
- package/.docs/raw/docs/guides/suggestions.mdx +0 -384
- package/.docs/raw/docs/guides/virtualization.mdx +0 -133
- package/.docs/raw/docs/guides/voice.mdx +0 -310
- package/.docs/raw/docs/ink/adapters.mdx +0 -99
- package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
- package/.docs/raw/docs/ink/hooks.mdx +0 -469
- package/.docs/raw/docs/ink/index.mdx +0 -236
- package/.docs/raw/docs/ink/migration.mdx +0 -138
- package/.docs/raw/docs/ink/primitives.mdx +0 -1259
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
- package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents/overview.mdx +0 -282
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
- package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
- package/.docs/raw/docs/integrations/index.mdx +0 -178
- package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
- package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
- package/.docs/raw/docs/migrations/index.mdx +0 -50
- package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
- package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
- package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
- package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
- package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
- package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
- package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
- package/.docs/raw/docs/primitives/attachment.mdx +0 -217
- package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
- package/.docs/raw/docs/primitives/composer.mdx +0 -659
- package/.docs/raw/docs/primitives/error.mdx +0 -142
- package/.docs/raw/docs/primitives/index.mdx +0 -99
- package/.docs/raw/docs/primitives/message.mdx +0 -618
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
- package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
- package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
- package/.docs/raw/docs/primitives/thread.mdx +0 -509
- package/.docs/raw/docs/react-native/adapters.mdx +0 -94
- package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
- package/.docs/raw/docs/react-native/hooks.mdx +0 -339
- package/.docs/raw/docs/react-native/index.mdx +0 -289
- package/.docs/raw/docs/react-native/migration.mdx +0 -142
- package/.docs/raw/docs/react-native/primitives.mdx +0 -839
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -255
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
- package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -716
- package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
- package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
- package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
- package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
- package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
- package/.docs/raw/docs/tools/a2ui.mdx +0 -107
- package/.docs/raw/docs/tools/backend.mdx +0 -147
- package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
- package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
- package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
- package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
- package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
- package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
- package/.docs/raw/docs/tools/index.mdx +0 -72
- package/.docs/raw/docs/tools/interactables.mdx +0 -1084
- package/.docs/raw/docs/tools/mcp-apps.mdx +0 -346
- package/.docs/raw/docs/tools/mcp.mdx +0 -466
- package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
- package/.docs/raw/docs/tools/openui.mdx +0 -175
- package/.docs/raw/docs/tools/tool-ui.mdx +0 -1008
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- package/.docs/raw/docs/ui/accordion.mdx +0 -266
- package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
- package/.docs/raw/docs/ui/attachment.mdx +0 -259
- package/.docs/raw/docs/ui/badge.mdx +0 -150
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -212
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/diff-viewer.mdx +0 -280
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- package/.docs/raw/docs/ui/dot-matrix.mdx +0 -133
- package/.docs/raw/docs/ui/file.mdx +0 -159
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
- package/.docs/raw/docs/ui/image.mdx +0 -102
- package/.docs/raw/docs/ui/markdown.mdx +0 -64
- package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
- package/.docs/raw/docs/ui/mermaid.mdx +0 -92
- package/.docs/raw/docs/ui/message-timing.mdx +0 -93
- package/.docs/raw/docs/ui/model-selector.mdx +0 -455
- package/.docs/raw/docs/ui/number-roll.mdx +0 -154
- package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -186
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/select.mdx +0 -254
- package/.docs/raw/docs/ui/sources.mdx +0 -177
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/tabs.mdx +0 -271
- package/.docs/raw/docs/ui/thread-list.mdx +0 -372
- package/.docs/raw/docs/ui/thread.mdx +0 -512
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -127
- package/.docs/raw/docs/ui/tool-group.mdx +0 -240
- package/.docs/raw/docs/ui/voice.mdx +0 -173
- package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
- package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
- package/dist/constants.d.ts +0 -14
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/prepare-docs/code-examples.d.ts +0 -5
- package/dist/prepare-docs/code-examples.d.ts.map +0 -1
- package/dist/prepare-docs/code-examples.js +0 -117
- package/dist/prepare-docs/code-examples.js.map +0 -1
- package/dist/prepare-docs/copy-raw.d.ts +0 -5
- package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
- package/dist/prepare-docs/copy-raw.js +0 -49
- package/dist/prepare-docs/copy-raw.js.map +0 -1
- package/dist/prepare-docs/prepare.d.ts +0 -1
- package/dist/prepare-docs/prepare.js +0 -22
- package/dist/prepare-docs/prepare.js.map +0 -1
- package/dist/prompts/xulux-playground.d.ts +0 -12
- package/dist/prompts/xulux-playground.d.ts.map +0 -1
- package/dist/prompts/xulux-playground.js +0 -33
- package/dist/prompts/xulux-playground.js.map +0 -1
- package/dist/tools/docs.d.ts +0 -22
- package/dist/tools/docs.d.ts.map +0 -1
- package/dist/tools/docs.js +0 -177
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/examples.d.ts +0 -24
- package/dist/tools/examples.d.ts.map +0 -1
- package/dist/tools/examples.js +0 -87
- package/dist/tools/examples.js.map +0 -1
- package/dist/tools/resources.d.ts +0 -6
- package/dist/tools/resources.d.ts.map +0 -1
- package/dist/tools/resources.js +0 -75
- package/dist/tools/resources.js.map +0 -1
- package/dist/tools/search.d.ts +0 -24
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -39
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/tests/mcp-test-client.d.ts +0 -15
- package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
- package/dist/tools/tests/mcp-test-client.js +0 -68
- package/dist/tools/tests/mcp-test-client.js.map +0 -1
- package/dist/tools/tests/test-setup.d.ts +0 -7
- package/dist/tools/tests/test-setup.d.ts.map +0 -1
- package/dist/tools/tests/test-setup.js +0 -36
- package/dist/tools/tests/test-setup.js.map +0 -1
- package/dist/tools/xulux-templates.d.ts +0 -58
- package/dist/tools/xulux-templates.d.ts.map +0 -1
- package/dist/tools/xulux-templates.js +0 -84
- package/dist/tools/xulux-templates.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -18
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -20
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/mcp-format.d.ts +0 -11
- package/dist/utils/mcp-format.d.ts.map +0 -1
- package/dist/utils/mcp-format.js +0 -14
- package/dist/utils/mcp-format.js.map +0 -1
- package/dist/utils/mdx.d.ts +0 -12
- package/dist/utils/mdx.d.ts.map +0 -1
- package/dist/utils/mdx.js +0 -45
- package/dist/utils/mdx.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -12
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -93
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/search.d.ts +0 -10
- package/dist/utils/search.d.ts.map +0 -1
- package/dist/utils/search.js +0 -97
- package/dist/utils/search.js.map +0 -1
- package/dist/utils/security.d.ts +0 -5
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -22
- package/dist/utils/security.js.map +0 -1
- package/dist/xulux/catalog-client.d.ts +0 -14
- package/dist/xulux/catalog-client.d.ts.map +0 -1
- package/dist/xulux/catalog-client.js +0 -67
- package/dist/xulux/catalog-client.js.map +0 -1
- package/dist/xulux/fallback-catalog.d.ts +0 -7
- package/dist/xulux/fallback-catalog.d.ts.map +0 -1
- package/dist/xulux/fallback-catalog.js +0 -47
- package/dist/xulux/fallback-catalog.js.map +0 -1
- package/dist/xulux/fetch-sandbox.d.ts +0 -5
- package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
- package/dist/xulux/fetch-sandbox.js +0 -40
- package/dist/xulux/fetch-sandbox.js.map +0 -1
- package/dist/xulux/template-service.d.ts +0 -84
- package/dist/xulux/template-service.d.ts.map +0 -1
- package/dist/xulux/template-service.js +0 -223
- package/dist/xulux/template-service.js.map +0 -1
- package/dist/xulux/types.d.ts +0 -55
- package/dist/xulux/types.d.ts.map +0 -1
- package/dist/xulux/types.js +0 -6
- package/dist/xulux/types.js.map +0 -1
- package/src/constants.ts +0 -24
- package/src/prepare-docs/code-examples.ts +0 -158
- package/src/prepare-docs/copy-raw.ts +0 -50
- package/src/prepare-docs/prepare.ts +0 -24
- package/src/prompts/xulux-playground.ts +0 -36
- package/src/tools/docs.ts +0 -255
- package/src/tools/examples.ts +0 -114
- package/src/tools/resources.ts +0 -111
- package/src/tools/search.ts +0 -46
- package/src/tools/tests/completions.test.ts +0 -60
- package/src/tools/tests/directory-size-cap.test.ts +0 -50
- package/src/tools/tests/docs.test.ts +0 -144
- package/src/tools/tests/examples.test.ts +0 -94
- package/src/tools/tests/integration.test.ts +0 -45
- package/src/tools/tests/json-parsing.test.ts +0 -23
- package/src/tools/tests/listings-cache.test.ts +0 -19
- package/src/tools/tests/mcp-protocol.test.ts +0 -216
- package/src/tools/tests/mcp-test-client.ts +0 -111
- package/src/tools/tests/path-traversal.test.ts +0 -81
- package/src/tools/tests/resources.test.ts +0 -133
- package/src/tools/tests/search.test.ts +0 -37
- package/src/tools/tests/test-setup.ts +0 -50
- package/src/tools/tests/xulux-templates.test.ts +0 -262
- package/src/tools/xulux-templates.ts +0 -141
- package/src/utils/cache.ts +0 -20
- package/src/utils/logger.ts +0 -20
- package/src/utils/mcp-format.ts +0 -14
- package/src/utils/mdx.ts +0 -59
- package/src/utils/paths.ts +0 -139
- package/src/utils/search.ts +0 -131
- package/src/utils/security.ts +0 -52
- package/src/utils/tests/cache.test.ts +0 -51
- package/src/utils/tests/mcp-format.test.ts +0 -22
- package/src/utils/tests/security.test.ts +0 -119
- package/src/xulux/catalog-client.ts +0 -105
- package/src/xulux/fallback-catalog.ts +0 -63
- package/src/xulux/fetch-sandbox.ts +0 -56
- package/src/xulux/template-service.ts +0 -406
- package/src/xulux/types.ts +0 -60
|
@@ -1,659 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Composer
|
|
3
|
-
description: Build custom message input UIs with full control over layout and behavior.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
import { ComposerPrimitiveSample } from "@/components/docs/samples/composer-primitive";
|
|
8
|
-
import { ComposerPrimitive as ComposerPrimitiveDocs } from "@/generated/primitiveDocs";
|
|
9
|
-
|
|
10
|
-
The Composer primitive is the interface for composing new messages or editing existing ones. It handles submit behavior, keyboard shortcuts, focus management, attachment state, and streaming status. You provide the UI.
|
|
11
|
-
|
|
12
|
-
<Tabs items={["Preview", "Code"]}>
|
|
13
|
-
<Tab>
|
|
14
|
-
<ComposerPrimitiveSample />
|
|
15
|
-
</Tab>
|
|
16
|
-
<Tab>
|
|
17
|
-
```tsx
|
|
18
|
-
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
19
|
-
import { ArrowUpIcon } from "lucide-react";
|
|
20
|
-
|
|
21
|
-
export function MinimalComposer() {
|
|
22
|
-
return (
|
|
23
|
-
<ComposerPrimitive.Root className="flex w-full flex-col rounded-3xl border bg-muted">
|
|
24
|
-
<ComposerPrimitive.Input
|
|
25
|
-
placeholder="Ask anything..."
|
|
26
|
-
className="min-h-10 w-full resize-none bg-transparent px-5 pt-4 pb-3 text-sm focus:outline-none"
|
|
27
|
-
rows={1}
|
|
28
|
-
/>
|
|
29
|
-
<div className="flex items-center justify-end px-3 pb-3">
|
|
30
|
-
<ComposerPrimitive.Send className="flex size-8 items-center justify-center rounded-full bg-primary text-primary-foreground disabled:opacity-30">
|
|
31
|
-
<ArrowUpIcon className="size-4" />
|
|
32
|
-
</ComposerPrimitive.Send>
|
|
33
|
-
</div>
|
|
34
|
-
</ComposerPrimitive.Root>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
</Tab>
|
|
39
|
-
</Tabs>
|
|
40
|
-
|
|
41
|
-
## Quick Start
|
|
42
|
-
|
|
43
|
-
Minimal example:
|
|
44
|
-
|
|
45
|
-
```tsx
|
|
46
|
-
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
47
|
-
|
|
48
|
-
<ComposerPrimitive.Root>
|
|
49
|
-
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
50
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
51
|
-
</ComposerPrimitive.Root>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
`Root` renders a `<form>`, `Input` renders a `<textarea>`, and `Send` renders a `<button>`. Each part renders its native element by default, and supports `asChild` for element substitution.
|
|
55
|
-
|
|
56
|
-
<Callout type="info">
|
|
57
|
-
Runtime setup: primitives require runtime context. Wrap your UI in `AssistantRuntimeProvider` with a runtime (for example `useLocalRuntime(...)`). See [Pick a Runtime](/docs/runtimes/pick-a-runtime).
|
|
58
|
-
</Callout>
|
|
59
|
-
|
|
60
|
-
## Core Concepts
|
|
61
|
-
|
|
62
|
-
### New Message vs Edit Mode
|
|
63
|
-
|
|
64
|
-
A Composer placed inside a **Thread** composes new messages. A Composer placed inside a **Message** edits that message. The same primitives handle both, and the behavior changes automatically based on context.
|
|
65
|
-
|
|
66
|
-
```tsx
|
|
67
|
-
// New message composer
|
|
68
|
-
<ThreadPrimitive.Root>
|
|
69
|
-
<ComposerPrimitive.Root>
|
|
70
|
-
<ComposerPrimitive.Input />
|
|
71
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
72
|
-
</ComposerPrimitive.Root>
|
|
73
|
-
</ThreadPrimitive.Root>
|
|
74
|
-
|
|
75
|
-
// Edit composer (inside a message)
|
|
76
|
-
<MessagePrimitive.Root>
|
|
77
|
-
<ComposerPrimitive.Root>
|
|
78
|
-
<ComposerPrimitive.Input />
|
|
79
|
-
<ComposerPrimitive.Send>Save</ComposerPrimitive.Send>
|
|
80
|
-
<ComposerPrimitive.Cancel>Cancel</ComposerPrimitive.Cancel>
|
|
81
|
-
</ComposerPrimitive.Root>
|
|
82
|
-
</MessagePrimitive.Root>
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### The `asChild` Pattern
|
|
86
|
-
|
|
87
|
-
Every primitive part accepts `asChild` to merge its behavior onto your own element. This is how you use primitives with your own design system:
|
|
88
|
-
|
|
89
|
-
```tsx
|
|
90
|
-
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
91
|
-
|
|
92
|
-
<ComposerPrimitive.Input asChild>
|
|
93
|
-
<textarea
|
|
94
|
-
className="my-custom-textarea"
|
|
95
|
-
placeholder="Type here..."
|
|
96
|
-
/>
|
|
97
|
-
</ComposerPrimitive.Input>
|
|
98
|
-
|
|
99
|
-
<ComposerPrimitive.Send asChild>
|
|
100
|
-
<MyButton variant="primary">Send</MyButton>
|
|
101
|
-
</ComposerPrimitive.Send>
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
The primitive's behavior (keyboard handling, disabled state, form submission) is merged onto your element. Your styles, your component, primitive wiring.
|
|
105
|
-
|
|
106
|
-
<Callout type="info">
|
|
107
|
-
Own the input DOM entirely, such as a `contentEditable` surface or editor
|
|
108
|
-
library that cannot be expressed through `asChild` or `render`? See
|
|
109
|
-
[Headless Composer Input](/docs/guides/headless-composer-input) for the
|
|
110
|
-
unstable hook that supplies composer text and send gating without
|
|
111
|
-
`ComposerPrimitive.Input`.
|
|
112
|
-
</Callout>
|
|
113
|
-
|
|
114
|
-
### Unstable Trigger Popovers
|
|
115
|
-
|
|
116
|
-
Composer includes an unstable **trigger popover** system for character-triggered popovers (e.g. `@` for mentions, `/` for slash commands). Multiple triggers coexist under a single `TriggerPopoverRoot`.
|
|
117
|
-
|
|
118
|
-
```tsx
|
|
119
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
120
|
-
<ComposerPrimitive.Root>
|
|
121
|
-
<ComposerPrimitive.Input placeholder="Type @ to mention, / for commands..." />
|
|
122
|
-
|
|
123
|
-
{/* @ mention — inserts directive text into the message */}
|
|
124
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
125
|
-
char="@"
|
|
126
|
-
adapter={mentionAdapter}
|
|
127
|
-
>
|
|
128
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
129
|
-
{/* popover UI */}
|
|
130
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
131
|
-
|
|
132
|
-
{/* / slash command — runs a handler on selection; leaves an audit-trail chip by default */}
|
|
133
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
134
|
-
char="/"
|
|
135
|
-
adapter={slashAdapter}
|
|
136
|
-
>
|
|
137
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action
|
|
138
|
-
formatter={formatter}
|
|
139
|
-
onExecute={(item) => commandHandlers[item.id]?.()}
|
|
140
|
-
/>
|
|
141
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
142
|
-
{(items) => items.map(item => (
|
|
143
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item}>
|
|
144
|
-
{item.label}
|
|
145
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
146
|
-
))}
|
|
147
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
148
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
149
|
-
</ComposerPrimitive.Root>
|
|
150
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
See the [Mentions guide](/docs/guides/mentions) and [Slash Commands guide](/docs/guides/slash-commands) for full documentation.
|
|
154
|
-
|
|
155
|
-
## Parts
|
|
156
|
-
|
|
157
|
-
### Root
|
|
158
|
-
|
|
159
|
-
Form container for message composition. Renders a `<form>` element unless `asChild` is set.
|
|
160
|
-
|
|
161
|
-
```tsx
|
|
162
|
-
<ComposerPrimitive.Root className="flex w-full flex-col rounded-3xl border bg-muted">
|
|
163
|
-
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
164
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
165
|
-
</ComposerPrimitive.Root>
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
#### Compact Mode
|
|
169
|
-
|
|
170
|
-
Pass `compact` to opt into compact detection. While the input holds at most a single line of text and the composer has no attachments, quote, queued messages, or active dictation, the root renders a `data-compact` attribute. The prop only exposes this attribute for styling — it does not change the layout by itself. Target it with CSS to collapse the composer into a single row:
|
|
171
|
-
|
|
172
|
-
```tsx
|
|
173
|
-
<ComposerPrimitive.Root
|
|
174
|
-
compact
|
|
175
|
-
className="group/composer flex flex-col data-[compact]:flex-row data-[compact]:items-center"
|
|
176
|
-
>
|
|
177
|
-
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
178
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
179
|
-
</ComposerPrimitive.Root>
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Once the text wraps onto a second line, the composer expands and stays expanded until the input is cleared, so the layout doesn't oscillate at the wrap boundary.
|
|
183
|
-
|
|
184
|
-
### Input
|
|
185
|
-
|
|
186
|
-
Text input with keyboard shortcuts. Renders a `<textarea>` element unless `asChild` is set.
|
|
187
|
-
|
|
188
|
-
```tsx
|
|
189
|
-
<ComposerPrimitive.Input
|
|
190
|
-
submitMode="ctrlEnter"
|
|
191
|
-
cancelOnEscape
|
|
192
|
-
placeholder="Ask anything..."
|
|
193
|
-
/>
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
<PrimitivesTypeTable type="ComposerPrimitiveInputProps" parameters={ComposerPrimitiveDocs.Input.props.filter(p => p.name !== "asChild")} />
|
|
197
|
-
|
|
198
|
-
### Send
|
|
199
|
-
|
|
200
|
-
Submits the composer form. Renders a `<button>` element unless `asChild` is set.
|
|
201
|
-
|
|
202
|
-
```tsx
|
|
203
|
-
<ComposerPrimitive.Send className="rounded-full bg-primary px-3 py-2 text-primary-foreground">
|
|
204
|
-
Send
|
|
205
|
-
</ComposerPrimitive.Send>
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### Cancel
|
|
209
|
-
|
|
210
|
-
Cancels the current composition or edit session. Renders a `<button>` element unless `asChild` is set.
|
|
211
|
-
|
|
212
|
-
```tsx
|
|
213
|
-
<ComposerPrimitive.Cancel className="rounded-md px-3 py-2 text-sm hover:bg-muted">
|
|
214
|
-
Cancel
|
|
215
|
-
</ComposerPrimitive.Cancel>
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### AddAttachment
|
|
219
|
-
|
|
220
|
-
Opens file picker for attachments. Renders a `<button>` element unless `asChild` is set.
|
|
221
|
-
|
|
222
|
-
```tsx
|
|
223
|
-
<ComposerPrimitive.AddAttachment multiple>
|
|
224
|
-
Attach Files
|
|
225
|
-
</ComposerPrimitive.AddAttachment>
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
<PrimitivesTypeTable type="ComposerPrimitiveAddAttachmentProps" parameters={ComposerPrimitiveDocs.AddAttachment.props.filter(p => p.name !== "asChild")} />
|
|
229
|
-
|
|
230
|
-
### Attachments
|
|
231
|
-
|
|
232
|
-
Renders each attachment. Prefer the children render function for new code.
|
|
233
|
-
|
|
234
|
-
```tsx
|
|
235
|
-
<ComposerPrimitive.Attachments>
|
|
236
|
-
{({ attachment }) => {
|
|
237
|
-
if (attachment.type === "image") return <ImagePreview />;
|
|
238
|
-
if (attachment.type === "document") return <DocumentPreview />;
|
|
239
|
-
return <GenericPreview />;
|
|
240
|
-
}}
|
|
241
|
-
</ComposerPrimitive.Attachments>
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
<PrimitivesTypeTable type="ComposerPrimitiveAttachmentsProps" parameters={ComposerPrimitiveDocs.Attachments.props} />
|
|
245
|
-
|
|
246
|
-
### AttachmentByIndex
|
|
247
|
-
|
|
248
|
-
Renders a single attachment at a specific index.
|
|
249
|
-
|
|
250
|
-
```tsx
|
|
251
|
-
<ComposerPrimitive.AttachmentByIndex
|
|
252
|
-
index={0}
|
|
253
|
-
components={{ Attachment: MyAttachment }}
|
|
254
|
-
/>
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
<PrimitivesTypeTable type="ComposerPrimitiveAttachmentByIndexProps" parameters={ComposerPrimitiveDocs.AttachmentByIndex.props} />
|
|
258
|
-
|
|
259
|
-
### AttachmentDropzone
|
|
260
|
-
|
|
261
|
-
Drag-and-drop zone for file attachments. Sets `data-dragging` when a file is being dragged over it and the runtime supports attachments; without the attachments capability the dropzone accepts no files and shows no highlight. Non-file drags (text, links) are ignored. Renders a `<div>` element unless `asChild` is set.
|
|
262
|
-
|
|
263
|
-
```tsx
|
|
264
|
-
<ComposerPrimitive.AttachmentDropzone className="rounded-xl border-2 border-dashed data-[dragging]:border-primary data-[dragging]:bg-primary/5">
|
|
265
|
-
<ComposerPrimitive.Root>
|
|
266
|
-
...
|
|
267
|
-
</ComposerPrimitive.Root>
|
|
268
|
-
</ComposerPrimitive.AttachmentDropzone>
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
<PrimitivesTypeTable type="ComposerPrimitiveAttachmentDropzoneProps" parameters={ComposerPrimitiveDocs.AttachmentDropzone.props.filter(p => p.name !== "asChild")} />
|
|
272
|
-
|
|
273
|
-
### Dictate
|
|
274
|
-
|
|
275
|
-
Starts a dictation session. Renders a `<button>` element unless `asChild` is set.
|
|
276
|
-
|
|
277
|
-
```tsx
|
|
278
|
-
<ComposerPrimitive.Dictate className="rounded-md px-3 py-2 text-sm hover:bg-muted">
|
|
279
|
-
Start Dictation
|
|
280
|
-
</ComposerPrimitive.Dictate>
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### StopDictation
|
|
284
|
-
|
|
285
|
-
Stops the current dictation session. Renders a `<button>` element unless `asChild` is set.
|
|
286
|
-
|
|
287
|
-
```tsx
|
|
288
|
-
<ComposerPrimitive.StopDictation className="rounded-md px-3 py-2 text-sm hover:bg-muted">
|
|
289
|
-
Stop Dictation
|
|
290
|
-
</ComposerPrimitive.StopDictation>
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
### DictationTranscript
|
|
294
|
-
|
|
295
|
-
Renders the interim transcript while dictation is active. Renders a `<span>` element unless `asChild` is set.
|
|
296
|
-
|
|
297
|
-
```tsx
|
|
298
|
-
<ComposerPrimitive.DictationTranscript className="text-sm text-muted-foreground" />
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### If (deprecated)
|
|
302
|
-
|
|
303
|
-
<Callout type="warn">
|
|
304
|
-
Deprecated. Use [`AuiIf`](/docs/api-reference/primitives/assistant-if) instead.
|
|
305
|
-
</Callout>
|
|
306
|
-
|
|
307
|
-
```tsx
|
|
308
|
-
// Before (deprecated)
|
|
309
|
-
<ComposerPrimitive.If editing>...</ComposerPrimitive.If>
|
|
310
|
-
<ComposerPrimitive.If dictation>...</ComposerPrimitive.If>
|
|
311
|
-
|
|
312
|
-
// After
|
|
313
|
-
<AuiIf condition={(s) => s.composer.isEditing}>...</AuiIf>
|
|
314
|
-
<AuiIf condition={(s) => s.composer.dictation != null}>...</AuiIf>
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Quote
|
|
318
|
-
|
|
319
|
-
Container for quoted text preview inside the composer. Only renders when a quote is set. Renders a `<div>` element unless `asChild` is set.
|
|
320
|
-
|
|
321
|
-
```tsx
|
|
322
|
-
<ComposerPrimitive.Quote className="rounded-lg border bg-background px-3 py-2 text-sm">
|
|
323
|
-
<ComposerPrimitive.QuoteText />
|
|
324
|
-
<ComposerPrimitive.QuoteDismiss className="ml-2" />
|
|
325
|
-
</ComposerPrimitive.Quote>
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### QuoteText
|
|
329
|
-
|
|
330
|
-
Renders the quoted text content. Renders a `<span>` element unless `asChild` is set.
|
|
331
|
-
|
|
332
|
-
```tsx
|
|
333
|
-
<ComposerPrimitive.QuoteText />
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
### QuoteDismiss
|
|
337
|
-
|
|
338
|
-
Clears the active quote from the composer. Renders a `<button>` element unless `asChild` is set.
|
|
339
|
-
|
|
340
|
-
```tsx
|
|
341
|
-
<ComposerPrimitive.QuoteDismiss className="rounded-full p-1 hover:bg-muted">
|
|
342
|
-
Dismiss
|
|
343
|
-
</ComposerPrimitive.QuoteDismiss>
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
### Unstable_TriggerPopoverRoot
|
|
347
|
-
|
|
348
|
-
Root provider that groups one or more `TriggerPopover` declarations and owns the shared input plugin registry.
|
|
349
|
-
|
|
350
|
-
```tsx
|
|
351
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
352
|
-
<ComposerPrimitive.Root>
|
|
353
|
-
<LexicalComposerInput placeholder="Type @ to mention, / for commands..." />
|
|
354
|
-
<ComposerPrimitive.Unstable_TriggerPopover char="@" adapter={mentionAdapter}>
|
|
355
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
356
|
-
...
|
|
357
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
358
|
-
</ComposerPrimitive.Root>
|
|
359
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
### Unstable_TriggerPopover
|
|
363
|
-
|
|
364
|
-
Declares a trigger (by `char`, `adapter`) and renders the popover container. Selection behavior is declared by rendering exactly one behavior sub-primitive inside — either `<Unstable_TriggerPopover.Directive>` (insert a directive on selection) or `<Unstable_TriggerPopover.Action>` (run `onExecute` on selection). Only renders its DOM (and children) while the trigger is active in the composer input.
|
|
365
|
-
|
|
366
|
-
```tsx
|
|
367
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
368
|
-
char="@"
|
|
369
|
-
adapter={mentionAdapter}
|
|
370
|
-
className="rounded-lg border bg-popover p-1 shadow-md"
|
|
371
|
-
>
|
|
372
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
373
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
374
|
-
{(categories) => categories.map((category) => (
|
|
375
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem
|
|
376
|
-
key={category.id}
|
|
377
|
-
categoryId={category.id}
|
|
378
|
-
>
|
|
379
|
-
{category.label}
|
|
380
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
381
|
-
))}
|
|
382
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
383
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
Behavior is supplied by exactly one of two sub-primitives:
|
|
387
|
-
|
|
388
|
-
- `<Unstable_TriggerPopover.Directive formatter={...} onInserted={...} />` — writes `:type[label]{name=id}` into the composer text (mention behavior)
|
|
389
|
-
- `<Unstable_TriggerPopover.Action onExecute={...} removeOnExecute={...} />` — runs a callback on selection; leaves a directive chip behind by default (slash-command behavior)
|
|
390
|
-
|
|
391
|
-
### Unstable_TriggerPopover.Directive
|
|
392
|
-
|
|
393
|
-
Behavior sub-primitive. Registers the directive-insert behavior with its parent `TriggerPopover`. Renders nothing.
|
|
394
|
-
|
|
395
|
-
```tsx
|
|
396
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive
|
|
397
|
-
formatter={unstable_defaultDirectiveFormatter}
|
|
398
|
-
onInserted={(item) => track("mention", item.id)}
|
|
399
|
-
/>
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
### Unstable_TriggerPopover.Action
|
|
403
|
-
|
|
404
|
-
Behavior sub-primitive. Registers the action behavior with its parent `TriggerPopover`. Renders nothing. By default leaves a directive chip behind after executing (audit trail); pass `removeOnExecute` to strip the trigger text entirely.
|
|
405
|
-
|
|
406
|
-
```tsx
|
|
407
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action
|
|
408
|
-
onExecute={(item) => commandHandlers[item.id]?.()}
|
|
409
|
-
removeOnExecute={false}
|
|
410
|
-
/>
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### Unstable_TriggerPopoverCategories
|
|
414
|
-
|
|
415
|
-
Render-function primitive for the top-level category list. Only renders while no category is active and search mode is off.
|
|
416
|
-
|
|
417
|
-
```tsx
|
|
418
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
419
|
-
{(categories) => categories.map((category) => (
|
|
420
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem
|
|
421
|
-
key={category.id}
|
|
422
|
-
categoryId={category.id}
|
|
423
|
-
>
|
|
424
|
-
{category.label}
|
|
425
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
426
|
-
))}
|
|
427
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### Unstable_TriggerPopoverCategoryItem
|
|
431
|
-
|
|
432
|
-
Button that selects a category and drills into its items.
|
|
433
|
-
|
|
434
|
-
```tsx
|
|
435
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem categoryId="tools">
|
|
436
|
-
Tools
|
|
437
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
### Unstable_TriggerPopoverItems
|
|
441
|
-
|
|
442
|
-
Render-function primitive for the items inside the currently selected category (or global search results).
|
|
443
|
-
|
|
444
|
-
```tsx
|
|
445
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
446
|
-
{(items) => items.map((item) => (
|
|
447
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item} />
|
|
448
|
-
))}
|
|
449
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
### Unstable_TriggerPopoverItem
|
|
453
|
-
|
|
454
|
-
Selectable item inside the popover.
|
|
455
|
-
|
|
456
|
-
```tsx
|
|
457
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem item={item}>
|
|
458
|
-
{item.label}
|
|
459
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
### Unstable_TriggerPopoverBack
|
|
463
|
-
|
|
464
|
-
Back button used when drilling from categories into a specific item list.
|
|
465
|
-
|
|
466
|
-
```tsx
|
|
467
|
-
<ComposerPrimitive.Unstable_TriggerPopoverBack className="rounded-md px-2 py-1 text-sm hover:bg-accent">
|
|
468
|
-
Back
|
|
469
|
-
</ComposerPrimitive.Unstable_TriggerPopoverBack>
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
## Patterns
|
|
473
|
-
|
|
474
|
-
### With Attachments
|
|
475
|
-
|
|
476
|
-
```tsx
|
|
477
|
-
<ComposerPrimitive.Root>
|
|
478
|
-
<ComposerPrimitive.Attachments>
|
|
479
|
-
{({ attachment }) => {
|
|
480
|
-
if (attachment.type === "image") return <ImagePreview />;
|
|
481
|
-
if (attachment.type === "document") return <DocumentPreview />;
|
|
482
|
-
return <GenericPreview />;
|
|
483
|
-
}}
|
|
484
|
-
</ComposerPrimitive.Attachments>
|
|
485
|
-
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
486
|
-
<ComposerPrimitive.AddAttachment>
|
|
487
|
-
Attach
|
|
488
|
-
</ComposerPrimitive.AddAttachment>
|
|
489
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
490
|
-
</ComposerPrimitive.Root>
|
|
491
|
-
```
|
|
492
|
-
|
|
493
|
-
### With Drag-and-Drop
|
|
494
|
-
|
|
495
|
-
Wrap your composer with `AttachmentDropzone` to support dragging files directly onto the input area:
|
|
496
|
-
|
|
497
|
-
```tsx
|
|
498
|
-
<ComposerPrimitive.AttachmentDropzone className="rounded-xl border-2 border-dashed data-[dragging]:border-primary data-[dragging]:bg-primary/5">
|
|
499
|
-
<ComposerPrimitive.Root>
|
|
500
|
-
<ComposerPrimitive.Attachments>
|
|
501
|
-
{() => <MyAttachment />}
|
|
502
|
-
</ComposerPrimitive.Attachments>
|
|
503
|
-
<ComposerPrimitive.Input placeholder="Drop files or type..." />
|
|
504
|
-
<ComposerPrimitive.AddAttachment>Attach</ComposerPrimitive.AddAttachment>
|
|
505
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
506
|
-
</ComposerPrimitive.Root>
|
|
507
|
-
</ComposerPrimitive.AttachmentDropzone>
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
The dropzone sets `data-dragging` when a file is being dragged over it, so you can style the active state with CSS. It requires the runtime's attachments capability (an attachment adapter); without it the dropzone stays inert.
|
|
511
|
-
|
|
512
|
-
### With Voice Input
|
|
513
|
-
|
|
514
|
-
```tsx
|
|
515
|
-
<ComposerPrimitive.Root>
|
|
516
|
-
<ComposerPrimitive.Input placeholder="Ask or speak..." />
|
|
517
|
-
<AuiIf condition={(s) => s.composer.dictation != null}>
|
|
518
|
-
<ComposerPrimitive.DictationTranscript className="text-sm text-muted-foreground" />
|
|
519
|
-
</AuiIf>
|
|
520
|
-
<AuiIf condition={(s) => s.composer.dictation == null}>
|
|
521
|
-
<ComposerPrimitive.Dictate>Mic</ComposerPrimitive.Dictate>
|
|
522
|
-
</AuiIf>
|
|
523
|
-
<AuiIf condition={(s) => s.composer.dictation != null}>
|
|
524
|
-
<ComposerPrimitive.StopDictation>Stop</ComposerPrimitive.StopDictation>
|
|
525
|
-
</AuiIf>
|
|
526
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
527
|
-
</ComposerPrimitive.Root>
|
|
528
|
-
```
|
|
529
|
-
|
|
530
|
-
`DictationTranscript` renders a `<span>` showing the interim speech-to-text transcript while the user is speaking.
|
|
531
|
-
|
|
532
|
-
<Callout type="info">
|
|
533
|
-
Voice input requires a `DictationAdapter` configured in your runtime. See [Dictation](/docs/guides/dictation) for setup.
|
|
534
|
-
</Callout>
|
|
535
|
-
|
|
536
|
-
### Custom Submit Behavior
|
|
537
|
-
|
|
538
|
-
Use `onSubmit` on `Root` to intercept submission:
|
|
539
|
-
|
|
540
|
-
```tsx
|
|
541
|
-
<ComposerPrimitive.Root
|
|
542
|
-
onSubmit={(e) => {
|
|
543
|
-
// Runs before the message is sent
|
|
544
|
-
// e.g., track analytics, transform input
|
|
545
|
-
// Call e.preventDefault() to cancel the send
|
|
546
|
-
}}
|
|
547
|
-
>
|
|
548
|
-
<ComposerPrimitive.Input />
|
|
549
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
550
|
-
</ComposerPrimitive.Root>
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### Gate Sending on External State
|
|
554
|
-
|
|
555
|
-
Sometimes you want users to type while sending is temporarily blocked, for example while tool configuration, auth, or the first model context is still loading. Disabling the entire thread via `isDisabled` works but also disables the text input, which feels broken.
|
|
556
|
-
|
|
557
|
-
Use `isSendDisabled` on the runtime adapter to keep the input usable while blocking send:
|
|
558
|
-
|
|
559
|
-
```tsx
|
|
560
|
-
const runtime = useExternalStoreRuntime({
|
|
561
|
-
isSendDisabled: !toolsLoaded,
|
|
562
|
-
onNew,
|
|
563
|
-
messages,
|
|
564
|
-
// ...
|
|
565
|
-
});
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
When `isSendDisabled` is `true`:
|
|
569
|
-
|
|
570
|
-
- `composer.canSend` becomes `false`
|
|
571
|
-
- `<ComposerPrimitive.Send>` is disabled
|
|
572
|
-
- Enter and the `Cmd/Ctrl+Shift+Enter` steer hotkey become no-ops
|
|
573
|
-
- `aui.composer.send()` short-circuits at the runtime, so direct calls cannot escape the gate
|
|
574
|
-
|
|
575
|
-
Read the same flag from React with `<AuiIf>` to render hints alongside the input:
|
|
576
|
-
|
|
577
|
-
```tsx
|
|
578
|
-
<ComposerPrimitive.Root>
|
|
579
|
-
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
580
|
-
<AuiIf condition={(s) => !s.composer.canSend}>
|
|
581
|
-
<p className="text-sm text-muted-foreground">Loading tools, hang on...</p>
|
|
582
|
-
</AuiIf>
|
|
583
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
584
|
-
</ComposerPrimitive.Root>
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
`canSend` reflects the composer's own willingness to send (editing mode, non-empty content, `isSendDisabled` not set). Cross-thread gating like an in-flight run without queue support is layered on top by `<ComposerPrimitive.Send>` automatically.
|
|
588
|
-
|
|
589
|
-
`isSendDisabled` only gates the thread composer. Saving an in-progress message edit is unaffected, since it is a per-message action rather than a new send.
|
|
590
|
-
|
|
591
|
-
For the difference between `isDisabled` and `isSendDisabled`, see the [external store adapter reference](/docs/runtimes/custom/external-store).
|
|
592
|
-
|
|
593
|
-
### Ctrl+Enter to Submit
|
|
594
|
-
|
|
595
|
-
```tsx
|
|
596
|
-
<ComposerPrimitive.Root>
|
|
597
|
-
<ComposerPrimitive.Input submitMode="ctrlEnter" />
|
|
598
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
599
|
-
</ComposerPrimitive.Root>
|
|
600
|
-
```
|
|
601
|
-
|
|
602
|
-
With `submitMode="ctrlEnter"`, plain Enter inserts a newline and Ctrl/Cmd+Enter submits.
|
|
603
|
-
|
|
604
|
-
### Mobile / touch devices
|
|
605
|
-
|
|
606
|
-
```tsx
|
|
607
|
-
<ComposerPrimitive.Root>
|
|
608
|
-
<ComposerPrimitive.Input unstable_insertNewlineOnTouchEnter />
|
|
609
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
610
|
-
</ComposerPrimitive.Root>
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
`unstable_insertNewlineOnTouchEnter` switches Enter to insert a newline on touch-primary devices (detected via `(pointer: coarse) and (not (any-pointer: fine))`), so the on-screen Return key never accidentally sends a half-finished message. Submission moves to the explicit Send button, matching WhatsApp, Slack, Discord, iMessage, ChatGPT, and Claude.ai.
|
|
614
|
-
|
|
615
|
-
Desktop behavior is unchanged. A tablet paired with a hardware keyboard still gets `submitMode`'s usual semantics if you set `submitMode="ctrlEnter"` or `"none"` — the flag only downgrades the default `"enter"` mode.
|
|
616
|
-
|
|
617
|
-
### Floating Composer
|
|
618
|
-
|
|
619
|
-
Primitives aren't bound to any layout. Here's how the floating composer on this docs site is built, using the same `ComposerPrimitive.Root` and `ComposerPrimitive.Input` positioned with CSS:
|
|
620
|
-
|
|
621
|
-
```tsx
|
|
622
|
-
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
623
|
-
|
|
624
|
-
function FloatingComposer() {
|
|
625
|
-
return (
|
|
626
|
-
<div className="fixed bottom-6 left-1/2 z-40 w-full max-w-md -translate-x-1/2">
|
|
627
|
-
<ComposerPrimitive.Root>
|
|
628
|
-
<div className="rounded-xl border bg-background/80 shadow-lg backdrop-blur-sm">
|
|
629
|
-
<ComposerPrimitive.Input
|
|
630
|
-
asChild
|
|
631
|
-
unstable_focusOnRunStart={false}
|
|
632
|
-
unstable_focusOnScrollToBottom={false}
|
|
633
|
-
>
|
|
634
|
-
<textarea
|
|
635
|
-
placeholder="Ask a question..."
|
|
636
|
-
className="w-full resize-none bg-transparent px-3 py-2.5 text-sm focus:outline-none"
|
|
637
|
-
rows={1}
|
|
638
|
-
/>
|
|
639
|
-
</ComposerPrimitive.Input>
|
|
640
|
-
</div>
|
|
641
|
-
</ComposerPrimitive.Root>
|
|
642
|
-
</div>
|
|
643
|
-
);
|
|
644
|
-
}
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
The primitive handles everything about composing a message. The layout, animation, and visibility logic is all yours.
|
|
648
|
-
|
|
649
|
-
## Relationship to Components
|
|
650
|
-
|
|
651
|
-
The [Thread](/docs/ui/thread) component includes a full composer built from these primitives. If you need a working chat UI fast, start there. When you need a composer that doesn't fit inside a thread, such as a floating input, a sidebar composer, or a multi-step form, reach for `ComposerPrimitive` directly.
|
|
652
|
-
|
|
653
|
-
## API Reference
|
|
654
|
-
|
|
655
|
-
For full prop details on every part, see the [ComposerPrimitive API Reference](/docs/api-reference/primitives/composer).
|
|
656
|
-
|
|
657
|
-
Related:
|
|
658
|
-
- [ThreadPrimitive](/docs/primitives/thread)
|
|
659
|
-
- [AttachmentPrimitive](/docs/primitives/attachment)
|