@nadicodeai/ui 0.21.0 → 1.0.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/AGENTS.md +6 -7
- package/LICENSES/PAPER-SHADERS-APACHE-2.0.txt +186 -0
- package/NOTICE +12 -0
- package/README.md +14 -21
- package/dist/agents.d.ts +10 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +10 -0
- package/dist/components/agent-card.d.ts +13 -0
- package/dist/components/agent-card.d.ts.map +1 -0
- package/dist/components/agent-card.js +15 -0
- package/dist/components/agent-visual.d.ts +17 -0
- package/dist/components/agent-visual.d.ts.map +1 -0
- package/dist/components/agent-visual.js +59 -0
- package/dist/components/alert-dialog.js +1 -1
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/badge.d.ts.map +1 -1
- package/dist/components/badge.js +9 -0
- package/dist/components/button.d.ts +1 -1
- package/dist/components/card.d.ts +5 -3
- package/dist/components/card.d.ts.map +1 -1
- package/dist/components/card.js +7 -7
- package/dist/components/chart.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/context-menu.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/drawer.js +1 -1
- package/dist/components/dropdown-menu.js +1 -1
- package/dist/components/empty.d.ts +5 -2
- package/dist/components/empty.d.ts.map +1 -1
- package/dist/components/empty.js +3 -3
- package/dist/components/feedback-state.js +1 -1
- package/dist/components/glass-control.d.ts +7 -0
- package/dist/components/glass-control.d.ts.map +1 -0
- package/dist/components/glass-control.js +14 -0
- package/dist/components/hover-card.js +1 -1
- package/dist/components/label-system.d.ts +1 -10
- package/dist/components/label-system.d.ts.map +1 -1
- package/dist/components/label-system.js +1 -7
- package/dist/components/live-demo.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/nav-bar.d.ts +6 -8
- package/dist/components/nav-bar.d.ts.map +1 -1
- package/dist/components/nav-bar.js +8 -9
- package/dist/components/navigation-menu.js +2 -2
- package/dist/components/popover.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/sonner.js +2 -2
- package/dist/components/testimonials.d.ts +1 -1
- package/dist/components/testimonials.js +2 -2
- package/dist/components/tooltip.js +1 -1
- package/dist/components/use-case-bento.d.ts +2 -4
- package/dist/components/use-case-bento.d.ts.map +1 -1
- package/dist/components/use-case-bento.js +2 -3
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/index.d.ts +3 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -16
- package/dist/internal/agent-visual/color.d.ts +4 -0
- package/dist/internal/agent-visual/color.d.ts.map +1 -0
- package/dist/internal/agent-visual/color.js +39 -0
- package/dist/internal/agent-visual/poster.d.ts +6 -0
- package/dist/internal/agent-visual/poster.d.ts.map +1 -0
- package/dist/internal/agent-visual/poster.js +35 -0
- package/dist/internal/agent-visual/recipes.d.ts +15 -0
- package/dist/internal/agent-visual/recipes.d.ts.map +1 -0
- package/dist/internal/agent-visual/recipes.js +72 -0
- package/dist/internal/agent-visual/renderer.d.ts +10 -0
- package/dist/internal/agent-visual/renderer.d.ts.map +1 -0
- package/dist/internal/agent-visual/renderer.js +112 -0
- package/dist/internal/agent-visual/shader.d.ts +2 -0
- package/dist/internal/agent-visual/shader.d.ts.map +1 -0
- package/dist/internal/agent-visual/shader.js +158 -0
- package/dist/internal/assistant-ui/attachment.d.ts +5 -0
- package/dist/internal/assistant-ui/attachment.d.ts.map +1 -0
- package/dist/internal/assistant-ui/attachment.js +93 -0
- package/dist/internal/assistant-ui/follow-up-suggestions.d.ts +3 -0
- package/dist/internal/assistant-ui/follow-up-suggestions.d.ts.map +1 -0
- package/dist/internal/assistant-ui/follow-up-suggestions.js +8 -0
- package/dist/internal/assistant-ui/markdown-text.d.ts +2 -0
- package/dist/internal/assistant-ui/markdown-text.d.ts.map +1 -0
- package/dist/internal/assistant-ui/markdown-text.js +54 -0
- package/dist/internal/assistant-ui/reasoning.d.ts +31 -0
- package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -0
- package/dist/internal/assistant-ui/reasoning.js +118 -0
- package/dist/internal/assistant-ui/thread.d.ts +26 -0
- package/dist/internal/assistant-ui/thread.d.ts.map +1 -0
- package/dist/internal/assistant-ui/thread.js +118 -0
- package/dist/internal/assistant-ui/tool-fallback.d.ts +10 -0
- package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -0
- package/dist/internal/assistant-ui/tool-fallback.js +163 -0
- package/dist/internal/assistant-ui/tool-group.d.ts +18 -0
- package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -0
- package/dist/internal/assistant-ui/tool-group.js +44 -0
- package/dist/internal/assistant-ui/tooltip-icon-button.d.ts +8 -0
- package/dist/internal/assistant-ui/tooltip-icon-button.d.ts.map +1 -0
- package/dist/internal/assistant-ui/tooltip-icon-button.js +10 -0
- package/dist/styles/globals.css +24 -209
- package/docs/agents/nadicodeai-ui.md +8 -8
- package/docs/component-classification.md +1 -1
- package/docs/consuming-cross-repo.md +12 -4
- package/docs/contract.md +83 -7
- package/docs/migration/1.0.0.md +75 -0
- package/docs/migration/base-ui-migration.md +0 -11
- package/docs/product-compositions.md +1 -1
- package/llms.txt +7 -6
- package/package.json +17 -29
- package/skills/nadicodeai-ui/SKILL.md +11 -7
- package/dist/ai-elements.d.ts +0 -49
- package/dist/ai-elements.d.ts.map +0 -1
- package/dist/ai-elements.js +0 -48
- package/dist/components/agent-avatar.d.ts +0 -7
- package/dist/components/agent-avatar.d.ts.map +0 -1
- package/dist/components/agent-avatar.js +0 -6
- package/dist/components/agent-chat.d.ts +0 -20
- package/dist/components/agent-chat.d.ts.map +0 -1
- package/dist/components/agent-chat.js +0 -10
- package/dist/components/agent-composer.d.ts +0 -56
- package/dist/components/agent-composer.d.ts.map +0 -1
- package/dist/components/agent-composer.js +0 -56
- package/dist/components/agent-message.d.ts +0 -117
- package/dist/components/agent-message.d.ts.map +0 -1
- package/dist/components/agent-message.js +0 -99
- package/dist/components/agent-thread.d.ts +0 -26
- package/dist/components/agent-thread.d.ts.map +0 -1
- package/dist/components/agent-thread.js +0 -63
- package/dist/components/agent-tool-approval.d.ts +0 -27
- package/dist/components/agent-tool-approval.d.ts.map +0 -1
- package/dist/components/agent-tool-approval.js +0 -43
- package/dist/components/ai-elements/agent.d.ts +0 -27
- package/dist/components/ai-elements/agent.d.ts.map +0 -1
- package/dist/components/ai-elements/agent.js +0 -25
- package/dist/components/ai-elements/artifact.d.ts +0 -24
- package/dist/components/ai-elements/artifact.d.ts.map +0 -1
- package/dist/components/ai-elements/artifact.js +0 -20
- package/dist/components/ai-elements/attachments.d.ts +0 -55
- package/dist/components/ai-elements/attachments.d.ts.map +0 -1
- package/dist/components/ai-elements/attachments.js +0 -125
- package/dist/components/ai-elements/audio-player.d.ts +0 -30
- package/dist/components/ai-elements/audio-player.d.ts.map +0 -1
- package/dist/components/ai-elements/audio-player.js +0 -41
- package/dist/components/ai-elements/canvas.d.ts +0 -8
- package/dist/components/ai-elements/canvas.d.ts.map +0 -1
- package/dist/components/ai-elements/canvas.js +0 -5
- package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
- package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
- package/dist/components/ai-elements/chain-of-thought.js +0 -49
- package/dist/components/ai-elements/checkpoint.d.ts +0 -12
- package/dist/components/ai-elements/checkpoint.d.ts.map +0 -1
- package/dist/components/ai-elements/checkpoint.js +0 -10
- package/dist/components/ai-elements/code-block.d.ts +0 -53
- package/dist/components/ai-elements/code-block.d.ts.map +0 -1
- package/dist/components/ai-elements/code-block.js +0 -239
- package/dist/components/ai-elements/commit.d.ts +0 -65
- package/dist/components/ai-elements/commit.d.ts.map +0 -1
- package/dist/components/ai-elements/commit.js +0 -83
- package/dist/components/ai-elements/confirmation.d.ts +0 -50
- package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
- package/dist/components/ai-elements/confirmation.js +0 -57
- package/dist/components/ai-elements/connection.d.ts +0 -6
- package/dist/components/ai-elements/connection.d.ts.map +0 -1
- package/dist/components/ai-elements/connection.js +0 -10
- package/dist/components/ai-elements/context.d.ts +0 -33
- package/dist/components/ai-elements/context.d.ts.map +0 -1
- package/dist/components/ai-elements/context.js +0 -147
- package/dist/components/ai-elements/controls.d.ts +0 -5
- package/dist/components/ai-elements/controls.d.ts.map +0 -1
- package/dist/components/ai-elements/controls.js +0 -5
- package/dist/components/ai-elements/conversation.d.ts +0 -24
- package/dist/components/ai-elements/conversation.d.ts.map +0 -1
- package/dist/components/ai-elements/conversation.js +0 -41
- package/dist/components/ai-elements/edge.d.ts +0 -6
- package/dist/components/ai-elements/edge.d.ts.map +0 -1
- package/dist/components/ai-elements/edge.js +0 -88
- package/dist/components/ai-elements/environment-variables.d.ts +0 -39
- package/dist/components/ai-elements/environment-variables.d.ts.map +0 -1
- package/dist/components/ai-elements/environment-variables.js +0 -60
- package/dist/components/ai-elements/file-tree.d.ts +0 -27
- package/dist/components/ai-elements/file-tree.d.ts.map +0 -1
- package/dist/components/ai-elements/file-tree.js +0 -73
- package/dist/components/ai-elements/image.d.ts +0 -7
- package/dist/components/ai-elements/image.d.ts.map +0 -1
- package/dist/components/ai-elements/image.js +0 -3
- package/dist/components/ai-elements/inline-citation.d.ts +0 -39
- package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
- package/dist/components/ai-elements/inline-citation.js +0 -86
- package/dist/components/ai-elements/jsx-preview.d.ts +0 -30
- package/dist/components/ai-elements/jsx-preview.d.ts.map +0 -1
- package/dist/components/ai-elements/jsx-preview.js +0 -159
- package/dist/components/ai-elements/message.d.ts +0 -38
- package/dist/components/ai-elements/message.d.ts.map +0 -1
- package/dist/components/ai-elements/message.js +0 -91
- package/dist/components/ai-elements/mic-selector.d.ts +0 -46
- package/dist/components/ai-elements/mic-selector.d.ts.map +0 -1
- package/dist/components/ai-elements/mic-selector.js +0 -180
- package/dist/components/ai-elements/model-selector.d.ts +0 -36
- package/dist/components/ai-elements/model-selector.d.ts.map +0 -1
- package/dist/components/ai-elements/model-selector.js +0 -18
- package/dist/components/ai-elements/node.d.ts +0 -22
- package/dist/components/ai-elements/node.d.ts.map +0 -1
- package/dist/components/ai-elements/node.js +0 -12
- package/dist/components/ai-elements/open-in-chat.d.ts +0 -27
- package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
- package/dist/components/ai-elements/open-in-chat.js +0 -81
- package/dist/components/ai-elements/package-info.d.ts +0 -30
- package/dist/components/ai-elements/package-info.d.ts.map +0 -1
- package/dist/components/ai-elements/package-info.js +0 -50
- package/dist/components/ai-elements/panel.d.ts +0 -6
- package/dist/components/ai-elements/panel.d.ts.map +0 -1
- package/dist/components/ai-elements/panel.js +0 -5
- package/dist/components/ai-elements/persona.d.ts +0 -49
- package/dist/components/ai-elements/persona.d.ts.map +0 -1
- package/dist/components/ai-elements/persona.js +0 -175
- package/dist/components/ai-elements/plan.d.ts +0 -27
- package/dist/components/ai-elements/plan.d.ts.map +0 -1
- package/dist/components/ai-elements/plan.js +0 -34
- package/dist/components/ai-elements/prompt-input.d.ts +0 -149
- package/dist/components/ai-elements/prompt-input.d.ts.map +0 -1
- package/dist/components/ai-elements/prompt-input.js +0 -704
- package/dist/components/ai-elements/queue.d.ts +0 -62
- package/dist/components/ai-elements/queue.d.ts.map +0 -1
- package/dist/components/ai-elements/queue.js +0 -24
- package/dist/components/ai-elements/reasoning.d.ts +0 -27
- package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
- package/dist/components/ai-elements/reasoning.js +0 -92
- package/dist/components/ai-elements/sandbox.d.ts +0 -25
- package/dist/components/ai-elements/sandbox.d.ts.map +0 -1
- package/dist/components/ai-elements/sandbox.js +0 -15
- package/dist/components/ai-elements/schema-display.d.ts +0 -56
- package/dist/components/ai-elements/schema-display.d.ts.map +0 -1
- package/dist/components/ai-elements/schema-display.js +0 -90
- package/dist/components/ai-elements/shimmer.d.ts +0 -10
- package/dist/components/ai-elements/shimmer.d.ts.map +0 -1
- package/dist/components/ai-elements/shimmer.js +0 -11
- package/dist/components/ai-elements/snippet.d.ts +0 -19
- package/dist/components/ai-elements/snippet.d.ts.map +0 -1
- package/dist/components/ai-elements/snippet.js +0 -32
- package/dist/components/ai-elements/sources.d.ts +0 -13
- package/dist/components/ai-elements/sources.d.ts.map +0 -1
- package/dist/components/ai-elements/sources.js +0 -9
- package/dist/components/ai-elements/speech-input.d.ts +0 -55
- package/dist/components/ai-elements/speech-input.d.ts.map +0 -1
- package/dist/components/ai-elements/speech-input.js +0 -187
- package/dist/components/ai-elements/stack-trace.d.ts +0 -38
- package/dist/components/ai-elements/stack-trace.d.ts.map +0 -1
- package/dist/components/ai-elements/stack-trace.js +0 -181
- package/dist/components/ai-elements/suggestion.d.ts +0 -11
- package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
- package/dist/components/ai-elements/suggestion.js +0 -13
- package/dist/components/ai-elements/task.d.ts +0 -15
- package/dist/components/ai-elements/task.d.ts.map +0 -1
- package/dist/components/ai-elements/task.js +0 -10
- package/dist/components/ai-elements/terminal.d.ts +0 -28
- package/dist/components/ai-elements/terminal.d.ts.map +0 -1
- package/dist/components/ai-elements/terminal.js +0 -55
- package/dist/components/ai-elements/test-results.d.ts +0 -59
- package/dist/components/ai-elements/test-results.d.ts.map +0 -1
- package/dist/components/ai-elements/test-results.js +0 -98
- package/dist/components/ai-elements/tool.d.ts +0 -32
- package/dist/components/ai-elements/tool.d.ts.map +0 -1
- package/dist/components/ai-elements/tool.js +0 -49
- package/dist/components/ai-elements/toolbar.d.ts +0 -6
- package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
- package/dist/components/ai-elements/toolbar.js +0 -5
- package/dist/components/ai-elements/transcription.d.ts +0 -17
- package/dist/components/ai-elements/transcription.d.ts.map +0 -1
- package/dist/components/ai-elements/transcription.js +0 -36
- package/dist/components/ai-elements/voice-selector.d.ts +0 -65
- package/dist/components/ai-elements/voice-selector.d.ts.map +0 -1
- package/dist/components/ai-elements/voice-selector.js +0 -224
- package/dist/components/ai-elements/web-preview.d.ts +0 -35
- package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
- package/dist/components/ai-elements/web-preview.js +0 -66
- package/dist/components/artifact-panel.d.ts +0 -130
- package/dist/components/artifact-panel.d.ts.map +0 -1
- package/dist/components/artifact-panel.js +0 -180
- package/dist/components/attachment.d.ts +0 -24
- package/dist/components/attachment.d.ts.map +0 -1
- package/dist/components/attachment.js +0 -68
- package/dist/components/bubble.d.ts +0 -17
- package/dist/components/bubble.d.ts.map +0 -1
- package/dist/components/bubble.js +0 -59
- package/dist/components/demo-surface.d.ts +0 -34
- package/dist/components/demo-surface.d.ts.map +0 -1
- package/dist/components/demo-surface.js +0 -21
- package/dist/components/files-preview.d.ts +0 -36
- package/dist/components/files-preview.d.ts.map +0 -1
- package/dist/components/files-preview.js +0 -85
- package/dist/components/marker.d.ts +0 -11
- package/dist/components/marker.d.ts.map +0 -1
- package/dist/components/marker.js +0 -34
- package/dist/components/message-scroller.d.ts +0 -17
- package/dist/components/message-scroller.d.ts.map +0 -1
- package/dist/components/message-scroller.js +0 -29
- package/dist/components/message.d.ts +0 -11
- package/dist/components/message.d.ts.map +0 -1
- package/dist/components/message.js +0 -21
- package/dist/components/state-notice.d.ts +0 -13
- package/dist/components/state-notice.d.ts.map +0 -1
- package/dist/components/state-notice.js +0 -8
- package/dist/components/watch-it-work-band.d.ts +0 -12
- package/dist/components/watch-it-work-band.d.ts.map +0 -1
- package/dist/components/watch-it-work-band.js +0 -8
- package/dist/hooks/use-controllable-state.d.ts +0 -9
- package/dist/hooks/use-controllable-state.d.ts.map +0 -1
- package/dist/hooks/use-controllable-state.js +0 -23
- package/dist/lib/agent-attachment.d.ts +0 -11
- package/dist/lib/agent-attachment.d.ts.map +0 -1
- package/dist/lib/agent-attachment.js +0 -19
- package/dist/lib/agent-contracts.d.ts +0 -132
- package/dist/lib/agent-contracts.d.ts.map +0 -1
- package/dist/lib/agent-contracts.js +0 -6
- package/dist/lib/agent-state.d.ts +0 -22
- package/dist/lib/agent-state.d.ts.map +0 -1
- package/dist/lib/agent-state.js +0 -96
- package/dist/lib/agent-work-state.d.ts +0 -36
- package/dist/lib/agent-work-state.d.ts.map +0 -1
- package/dist/lib/agent-work-state.js +0 -36
- package/dist/lib/message-scroller-primitive/components.d.ts +0 -17
- package/dist/lib/message-scroller-primitive/components.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/components.js +0 -204
- package/dist/lib/message-scroller-primitive/geometry.d.ts +0 -51
- package/dist/lib/message-scroller-primitive/geometry.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/geometry.js +0 -199
- package/dist/lib/message-scroller-primitive/index.d.ts +0 -12
- package/dist/lib/message-scroller-primitive/index.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/index.js +0 -12
- package/dist/lib/message-scroller-primitive/stores.d.ts +0 -6
- package/dist/lib/message-scroller-primitive/stores.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/stores.js +0 -53
- package/dist/lib/message-scroller-primitive/types.d.ts +0 -88
- package/dist/lib/message-scroller-primitive/types.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/types.js +0 -40
- package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts +0 -19
- package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/use-message-scroller-commands.js +0 -188
- package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts +0 -7
- package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/use-message-scroller-controller.js +0 -506
- package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts +0 -49
- package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/use-message-scroller-refs.js +0 -90
- package/dist/lib/message-scroller-primitive/use-render.d.ts +0 -22
- package/dist/lib/message-scroller-primitive/use-render.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/use-render.js +0 -113
- package/dist/lib/message-scroller-primitive/utils.d.ts +0 -4
- package/dist/lib/message-scroller-primitive/utils.d.ts.map +0 -1
- package/dist/lib/message-scroller-primitive/utils.js +0 -9
- package/docs/agent-work-surfaces.md +0 -132
- package/docs/migration/ai-elements-vendoring.md +0 -29
- package/docs/terminal-tui-semantics.md +0 -172
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Modified from Paper Shaders 0.0.78 Metaballs (Apache-2.0).
|
|
3
|
+
* The metaball field, motion, colour blending, and edge calculation remain
|
|
4
|
+
* Paper's construction. `surfacePattern` clips the four approved NadicodeAI
|
|
5
|
+
* identity materials inside that generated form. Attribution ships in NOTICE.
|
|
6
|
+
*/
|
|
7
|
+
export const AGENT_VISUAL_SHADER = `#version 300 es
|
|
8
|
+
precision mediump float;
|
|
9
|
+
|
|
10
|
+
uniform float u_time;
|
|
11
|
+
uniform sampler2D u_noiseTexture;
|
|
12
|
+
uniform vec4 u_colorBack;
|
|
13
|
+
uniform vec4 u_colors[8];
|
|
14
|
+
uniform float u_colorsCount;
|
|
15
|
+
uniform float u_size;
|
|
16
|
+
uniform float u_count;
|
|
17
|
+
uniform float u_material;
|
|
18
|
+
uniform float u_detail;
|
|
19
|
+
uniform vec2 u_resolution;
|
|
20
|
+
|
|
21
|
+
in vec2 v_objectUV;
|
|
22
|
+
out vec4 fragColor;
|
|
23
|
+
|
|
24
|
+
#define TWO_PI 6.28318530718
|
|
25
|
+
|
|
26
|
+
float randomR(vec2 p) {
|
|
27
|
+
vec2 uv = floor(p) / 100. + .5;
|
|
28
|
+
return texture(u_noiseTexture, fract(uv)).r;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
float noise(float x) {
|
|
32
|
+
float i = floor(x);
|
|
33
|
+
float f = fract(x);
|
|
34
|
+
float u = f * f * (3.0 - 2.0 * f);
|
|
35
|
+
return mix(randomR(vec2(i, 0.0)), randomR(vec2(i + 1.0, 0.0)), u);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
float getBallShape(vec2 uv, vec2 c, float p) {
|
|
39
|
+
float s = .5 * length(uv - c);
|
|
40
|
+
s = 1. - clamp(s, 0., 1.);
|
|
41
|
+
return pow(s, p);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
float hash21(vec2 p) {
|
|
45
|
+
p = fract(p * vec2(123.34, 456.21));
|
|
46
|
+
p += dot(p, p + 45.32);
|
|
47
|
+
return fract(p.x * p.y);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
float orderedPoints(vec2 surfaceUV, float depth) {
|
|
51
|
+
float density = clamp(min(u_resolution.x, u_resolution.y) / 12.0 * u_detail, 6.0, 34.0);
|
|
52
|
+
vec2 pointUV = fract(surfaceUV * density) - 0.5;
|
|
53
|
+
float radius = mix(0.14, 0.23, depth);
|
|
54
|
+
return 1.0 - smoothstep(radius * 0.7, radius, length(pointUV));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
float triangularWire(vec2 surfaceUV, float depth) {
|
|
58
|
+
float density = clamp(min(u_resolution.x, u_resolution.y) / 16.0 * u_detail, 5.0, 26.0);
|
|
59
|
+
vec2 grid = surfaceUV * density;
|
|
60
|
+
float horizontal = abs(fract(grid.y) - 0.5);
|
|
61
|
+
float diagonalA = abs(fract(grid.x + grid.y * 0.5) - 0.5);
|
|
62
|
+
float diagonalB = abs(fract(grid.x - grid.y * 0.5) - 0.5);
|
|
63
|
+
float nearestLine = min(horizontal, min(diagonalA, diagonalB));
|
|
64
|
+
float width = mix(0.032, 0.072, depth);
|
|
65
|
+
return 1.0 - smoothstep(width * 0.55, width, nearestLine);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
float particleLayer(vec2 surfaceUV, float density, float depth, float time, float layerSeed, float threshold) {
|
|
69
|
+
vec2 gridUV = surfaceUV * density + layerSeed;
|
|
70
|
+
vec2 cell = floor(gridUV);
|
|
71
|
+
vec2 local = fract(gridUV) - 0.5;
|
|
72
|
+
float seed = hash21(cell + layerSeed);
|
|
73
|
+
vec2 jitter = vec2(hash21(cell + layerSeed + 3.17), hash21(cell + layerSeed + 8.41)) - 0.5;
|
|
74
|
+
jitter *= 0.72;
|
|
75
|
+
jitter += 0.08 * vec2(sin(time * 0.42 + seed * 18.0 + layerSeed), cos(time * 0.31 + seed * 14.0 - layerSeed));
|
|
76
|
+
float radius = mix(0.055, 0.175, hash21(cell + layerSeed + 14.3)) * mix(0.78, 1.35, depth);
|
|
77
|
+
float particle = 1.0 - smoothstep(radius * 0.68, radius, length(local - jitter));
|
|
78
|
+
float brightness = mix(0.45, 1.0, hash21(cell + layerSeed + 24.7));
|
|
79
|
+
return particle * step(threshold, seed) * brightness;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
float livingParticles(vec2 surfaceUV, float depth, float time) {
|
|
83
|
+
float density = clamp(min(u_resolution.x, u_resolution.y) / 6.5 * u_detail, 13.0, 68.0);
|
|
84
|
+
float dust = particleLayer(surfaceUV, density, depth, time, 0.0, 0.16);
|
|
85
|
+
float motes = particleLayer(surfaceUV, density * 0.46, depth, time * 0.72, 19.7, 0.62);
|
|
86
|
+
return max(dust * 0.78, motes);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
float surfacePattern(vec2 surfaceUV, float depth, float material, float time) {
|
|
90
|
+
if (material < 0.5) return 1.0;
|
|
91
|
+
if (material < 1.5) return orderedPoints(surfaceUV, depth);
|
|
92
|
+
if (material < 2.5) return triangularWire(surfaceUV, depth);
|
|
93
|
+
return livingParticles(surfaceUV, depth, time);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void main() {
|
|
97
|
+
vec2 shape_uv = v_objectUV + .5;
|
|
98
|
+
const float firstFrameOffset = 2503.4;
|
|
99
|
+
float t = .2 * (u_time + firstFrameOffset);
|
|
100
|
+
vec3 totalColor = vec3(0.);
|
|
101
|
+
float totalShape = 0.;
|
|
102
|
+
float totalOpacity = 0.;
|
|
103
|
+
vec2 weightedCenter = vec2(0.);
|
|
104
|
+
vec2 weightedOrientation = vec2(0.);
|
|
105
|
+
float centerWeight = 0.;
|
|
106
|
+
|
|
107
|
+
for (int i = 0; i < 20; i++) {
|
|
108
|
+
if (i >= int(ceil(u_count))) break;
|
|
109
|
+
float idxFract = float(i) / 20.0;
|
|
110
|
+
float angle = TWO_PI * idxFract;
|
|
111
|
+
float speed = 1. - .2 * idxFract;
|
|
112
|
+
vec2 pos = vec2(.5) + 1e-4 + .9 * (vec2(noise(angle * 10. + float(i) + t * speed), noise(angle * 20. + float(i) - t * speed)) - .5);
|
|
113
|
+
int safeIndex = i % int(u_colorsCount + 0.5);
|
|
114
|
+
vec4 ballColor = u_colors[safeIndex];
|
|
115
|
+
ballColor.rgb *= ballColor.a;
|
|
116
|
+
float sizeFrac = 1.;
|
|
117
|
+
if (float(i) > floor(u_count - 1.)) sizeFrac *= fract(u_count);
|
|
118
|
+
float shape = getBallShape(shape_uv, pos, 45. - 30. * u_size * sizeFrac);
|
|
119
|
+
shape *= pow(u_size, .2);
|
|
120
|
+
shape = smoothstep(0., 1., shape);
|
|
121
|
+
totalColor += ballColor.rgb * shape;
|
|
122
|
+
totalShape += shape;
|
|
123
|
+
totalOpacity += ballColor.a * shape;
|
|
124
|
+
float centerContribution = shape * shape;
|
|
125
|
+
weightedCenter += pos * centerContribution;
|
|
126
|
+
weightedOrientation += vec2(cos(angle), sin(angle)) * centerContribution;
|
|
127
|
+
centerWeight += centerContribution;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
totalColor /= max(totalShape, 1e-4);
|
|
131
|
+
totalOpacity /= max(totalShape, 1e-4);
|
|
132
|
+
float edgeWidth = fwidth(totalShape);
|
|
133
|
+
float finalShape = smoothstep(.4, .4 + edgeWidth, totalShape);
|
|
134
|
+
vec2 fieldCenter = weightedCenter / max(centerWeight, 1e-4);
|
|
135
|
+
vec2 fieldVector = shape_uv - fieldCenter;
|
|
136
|
+
float depth = smoothstep(0.4, 1.45, totalShape);
|
|
137
|
+
float fieldRotation = 0.18 * atan(weightedOrientation.y, weightedOrientation.x);
|
|
138
|
+
float rotationCos = cos(fieldRotation);
|
|
139
|
+
float rotationSin = sin(fieldRotation);
|
|
140
|
+
vec2 surfaceUV = fieldCenter + mat2(rotationCos, rotationSin, -rotationSin, rotationCos) * fieldVector * (1.0 + 0.1 * depth);
|
|
141
|
+
vec2 gradient = vec2(dFdx(totalShape), dFdy(totalShape));
|
|
142
|
+
vec2 gradientDirection = gradient / max(length(gradient), 1e-4);
|
|
143
|
+
surfaceUV += gradientDirection * 0.008 * sin(totalShape * 4.0);
|
|
144
|
+
float feature = surfacePattern(surfaceUV, depth, u_material, t);
|
|
145
|
+
vec3 normal = normalize(vec3(-gradient * 36.0, 1.0));
|
|
146
|
+
vec3 lightDirection = normalize(vec3(-0.45, 0.65, 0.8));
|
|
147
|
+
float surfaceLight = 0.62 + 0.38 * max(dot(normal, lightDirection), 0.0);
|
|
148
|
+
float baseSurface = mix(0.012, 0.06, depth);
|
|
149
|
+
float surface = u_material < 0.5 ? 1.0 : mix(baseSurface, surfaceLight, feature);
|
|
150
|
+
vec3 color = totalColor * finalShape * surface;
|
|
151
|
+
float opacity = totalOpacity * finalShape * surface;
|
|
152
|
+
vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
|
|
153
|
+
color = color + bgColor * (1. - opacity);
|
|
154
|
+
opacity = opacity + u_colorBack.a * (1. - opacity);
|
|
155
|
+
color += 1. / 256. * (fract(sin(dot(.014 * gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453123) - .5);
|
|
156
|
+
fragColor = vec4(color, opacity);
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/attachment.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+C,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAkN7F,eAAO,MAAM,sBAAsB,EAAE,EAMpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,EAMjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,EAiBnC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState, isValidElement } from "react";
|
|
4
|
+
import { XIcon, PlusIcon, FileText, Loader2Icon, AlertCircleIcon } from "lucide-react";
|
|
5
|
+
import { AttachmentPrimitive, ComposerPrimitive, MessagePrimitive, useAuiState, useAui, } from "@assistant-ui/react";
|
|
6
|
+
import { useShallow } from "zustand/shallow";
|
|
7
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../components/tooltip.js";
|
|
8
|
+
import { Dialog, DialogTitle, DialogContent, DialogTrigger } from "../../components/dialog.js";
|
|
9
|
+
import { Avatar, AvatarImage, AvatarFallback } from "../../components/avatar.js";
|
|
10
|
+
import { TooltipIconButton } from "./tooltip-icon-button.js";
|
|
11
|
+
import { cn } from "../../lib/utils.js";
|
|
12
|
+
const useFileSrc = (file) => {
|
|
13
|
+
const [src, setSrc] = useState(undefined);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!file) {
|
|
16
|
+
setSrc(undefined);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const objectUrl = URL.createObjectURL(file);
|
|
20
|
+
setSrc(objectUrl);
|
|
21
|
+
return () => {
|
|
22
|
+
URL.revokeObjectURL(objectUrl);
|
|
23
|
+
};
|
|
24
|
+
}, [file]);
|
|
25
|
+
return src;
|
|
26
|
+
};
|
|
27
|
+
const useAttachmentSrc = () => {
|
|
28
|
+
const { file, src } = useAuiState(useShallow((s) => {
|
|
29
|
+
if (s.attachment.type !== "image")
|
|
30
|
+
return {};
|
|
31
|
+
if (s.attachment.file)
|
|
32
|
+
return { file: s.attachment.file };
|
|
33
|
+
const src = s.attachment.content?.filter((c) => c.type === "image")[0]?.image;
|
|
34
|
+
if (!src)
|
|
35
|
+
return {};
|
|
36
|
+
return { src };
|
|
37
|
+
}));
|
|
38
|
+
return useFileSrc(file) ?? src;
|
|
39
|
+
};
|
|
40
|
+
const AttachmentPreview = ({ src }) => {
|
|
41
|
+
return (_jsx("img", { src: src, alt: "Attachment preview", className: "aui-attachment-preview-image block h-auto max-h-[80vh] w-auto max-w-full rounded-sm object-contain" }));
|
|
42
|
+
};
|
|
43
|
+
const AttachmentPreviewDialog = ({ children }) => {
|
|
44
|
+
const src = useAttachmentSrc();
|
|
45
|
+
if (!src)
|
|
46
|
+
return children;
|
|
47
|
+
return (_jsxs(Dialog, { children: [_jsx(DialogTrigger, { nativeButton: false, className: "aui-attachment-preview-trigger", render: isValidElement(children) ? children : _jsx("button", { type: "button" }) }), _jsxs(DialogContent, { className: "aui-attachment-preview-dialog-content [&>button]:bg-foreground/60 [&>button]:hover:bg-foreground/80 [&_svg]:text-background p-2 sm:max-w-3xl [&>button]:rounded-full [&>button]:p-1 [&>button]:opacity-100 [&>button]:ring-0!", children: [_jsx(DialogTitle, { className: "aui-sr-only sr-only", children: "Image Attachment Preview" }), _jsx("div", { className: "aui-attachment-preview bg-background relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden rounded-sm", children: _jsx(AttachmentPreview, { src: src }) })] })] }));
|
|
48
|
+
};
|
|
49
|
+
const AttachmentThumb = () => {
|
|
50
|
+
const src = useAttachmentSrc();
|
|
51
|
+
return (_jsxs(Avatar, { className: "aui-attachment-tile-avatar h-full w-full rounded-none after:hidden", children: [_jsx(AvatarImage, { src: src, alt: "Attachment preview", className: "aui-attachment-tile-image object-cover" }), _jsx(AvatarFallback, { children: _jsx(FileText, { className: "aui-attachment-tile-fallback-icon text-muted-foreground/80 size-6 stroke-[1.5]" }) })] }));
|
|
52
|
+
};
|
|
53
|
+
const AttachmentUI = () => {
|
|
54
|
+
const aui = useAui();
|
|
55
|
+
const isComposer = aui.attachment.source !== "message";
|
|
56
|
+
const isImage = useAuiState((s) => s.attachment.type === "image");
|
|
57
|
+
const typeLabel = useAuiState((s) => {
|
|
58
|
+
const type = s.attachment.type;
|
|
59
|
+
switch (type) {
|
|
60
|
+
case "image":
|
|
61
|
+
return "Image";
|
|
62
|
+
case "document":
|
|
63
|
+
return "Document";
|
|
64
|
+
case "file":
|
|
65
|
+
return "File";
|
|
66
|
+
default:
|
|
67
|
+
return type;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const uploadState = useAuiState((s) => s.attachment.status.type === "running"
|
|
71
|
+
? "uploading"
|
|
72
|
+
: s.attachment.status.type === "incomplete" && s.attachment.status.reason === "error"
|
|
73
|
+
? "error"
|
|
74
|
+
: undefined);
|
|
75
|
+
const isUploading = uploadState === "uploading";
|
|
76
|
+
const isError = uploadState === "error";
|
|
77
|
+
const errorMessage = useAuiState((s) => s.attachment.status.type === "incomplete" && s.attachment.status.reason === "error"
|
|
78
|
+
? (s.attachment.status.message ?? "Upload failed")
|
|
79
|
+
: undefined);
|
|
80
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsxs(AttachmentPrimitive.Root, { className: cn("aui-attachment-root relative", isComposer && "nc-transition-opacity", isImage && !isComposer && "aui-attachment-root-message only:*:first:size-24"), children: [_jsx(AttachmentPreviewDialog, { children: _jsxs(TooltipTrigger, { render: _jsx("div", { className: cn("aui-attachment-tile nc-transition-transform relative size-14 cursor-pointer overflow-hidden rounded-[calc(var(--composer-radius)-var(--composer-padding))] bg-muted outline-none after:pointer-events-none after:absolute after:inset-0 after:rounded-[inherit] after:ring-1 after:ring-border after:ring-inset focus-visible:ring-[length:var(--ring-width-focus)] focus-visible:ring-ring/50 hover:after:bg-foreground/10", isError && "after:ring-destructive/60"), role: "button", tabIndex: 0, "aria-label": `${typeLabel} attachment${isError ? ", upload failed" : isUploading ? ", uploading" : ""}` }), children: [_jsx(AttachmentThumb, {}), isUploading && (_jsx("div", { "aria-hidden": "true", className: "aui-attachment-tile-uploading nc-transition-opacity absolute inset-0 flex items-center justify-center bg-background/60 backdrop-blur-[2px]", children: _jsx(Loader2Icon, { className: "size-4 text-muted-foreground motion-safe:animate-spin motion-reduce:animate-pulse" }) })), isError && (_jsx("div", { "aria-hidden": "true", className: "aui-attachment-tile-error nc-transition-opacity absolute inset-0 flex items-center justify-center bg-background/70 backdrop-blur-[2px]", children: _jsx(AlertCircleIcon, { className: "text-destructive size-4" }) }))] }) }), isComposer && _jsx(AttachmentRemove, {})] }), _jsxs(TooltipContent, { side: "top", children: [_jsx(AttachmentPrimitive.Name, {}), errorMessage && _jsx("p", { className: "aui-attachment-error-message", children: errorMessage })] })] }) }));
|
|
81
|
+
};
|
|
82
|
+
const AttachmentRemove = () => {
|
|
83
|
+
return (_jsx(AttachmentPrimitive.Remove, { render: _jsx(TooltipIconButton, { tooltip: "Remove file", className: "aui-attachment-tile-remove absolute end-1 top-1 size-5 rounded-full bg-foreground/70! text-background! backdrop-blur-sm after:absolute after:-inset-1.5 hover:bg-foreground/85!", side: "top" }), children: _jsx(XIcon, { className: "aui-attachment-remove-icon size-3 stroke-[2.5]" }) }));
|
|
84
|
+
};
|
|
85
|
+
export const UserMessageAttachments = () => {
|
|
86
|
+
return (_jsx("div", { className: "aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2", children: _jsx(MessagePrimitive.Attachments, { children: () => _jsx(AttachmentUI, {}) }) }));
|
|
87
|
+
};
|
|
88
|
+
export const ComposerAttachments = () => {
|
|
89
|
+
return (_jsx("div", { className: "aui-composer-attachments flex w-full flex-row items-center gap-2 overflow-x-auto empty:hidden", children: _jsx(ComposerPrimitive.Attachments, { children: () => _jsx(AttachmentUI, {}) }) }));
|
|
90
|
+
};
|
|
91
|
+
export const ComposerAddAttachment = () => {
|
|
92
|
+
return (_jsx(ComposerPrimitive.AddAttachment, { render: _jsx(TooltipIconButton, { tooltip: "Add Attachment", side: "bottom", variant: "ghost", size: "icon", className: "aui-composer-add-attachment size-7 rounded-full p-1 text-xs font-semibold hover:bg-muted", "aria-label": "Add Attachment" }), children: _jsx(PlusIcon, { className: "aui-attachment-add-icon size-4.5 stroke-[1.5px]" }) }));
|
|
93
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow-up-suggestions.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/follow-up-suggestions.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAwBhC,eAAO,MAAM,yBAAyB,EAAE,EAMvC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { AuiIf, ThreadPrimitive, useAuiState } from "@assistant-ui/react";
|
|
4
|
+
const FollowupSuggestionsRow = () => {
|
|
5
|
+
const suggestions = useAuiState((s) => s.thread.suggestions);
|
|
6
|
+
return (_jsx("div", { className: "aui-thread-followup-suggestions -my-1 w-full overflow-x-auto py-1 [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: _jsx("div", { className: "mx-auto flex min-h-8 w-max items-center gap-2 px-0.5", children: suggestions.map((suggestion, index) => (_jsx(ThreadPrimitive.Suggestion, { className: "aui-thread-followup-suggestion nc-transition-paint rounded-full border bg-background px-3 py-1 text-sm whitespace-nowrap hover:bg-muted/80", prompt: suggestion.prompt, method: "replace", autoSend: true, children: suggestion.prompt }, index))) }) }));
|
|
7
|
+
};
|
|
8
|
+
export const ThreadFollowupSuggestions = () => (_jsx(AuiIf, { condition: (s) => !s.thread.isEmpty && !s.thread.isRunning && s.thread.suggestions.length > 0, children: _jsx(FollowupSuggestionsRow, {}) }));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AA2BA,eAAO,MAAM,YAAY,wEAAyB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { MarkdownTextPrimitive, unstable_memoizeMarkdownComponents as memoizeMarkdownComponents, useIsMarkdownCodeBlock, } from "@assistant-ui/react-markdown";
|
|
4
|
+
import remarkGfm from "remark-gfm";
|
|
5
|
+
import { memo } from "react";
|
|
6
|
+
import { CheckIcon, CopyIcon } from "lucide-react";
|
|
7
|
+
import { TooltipIconButton } from "./tooltip-icon-button.js";
|
|
8
|
+
import { useCopyToClipboard } from "../../lib/use-copy-to-clipboard.js";
|
|
9
|
+
import { cn } from "../../lib/utils.js";
|
|
10
|
+
const MarkdownTextImpl = () => {
|
|
11
|
+
return (_jsx(MarkdownTextPrimitive, { remarkPlugins: [remarkGfm], className: "aui-md", components: defaultComponents, defer: true }));
|
|
12
|
+
};
|
|
13
|
+
export const MarkdownText = memo(MarkdownTextImpl);
|
|
14
|
+
const CodeHeader = ({ language, code }) => {
|
|
15
|
+
const { isCopied, copyToClipboard } = useCopyToClipboard({
|
|
16
|
+
text: code,
|
|
17
|
+
timeout: 3000,
|
|
18
|
+
skipWhileCopied: true,
|
|
19
|
+
});
|
|
20
|
+
const onCopy = () => {
|
|
21
|
+
if (!code || isCopied)
|
|
22
|
+
return;
|
|
23
|
+
void copyToClipboard();
|
|
24
|
+
};
|
|
25
|
+
return (_jsxs("div", { className: "aui-code-header-root border-border/50 bg-muted/50 mt-3 flex items-center justify-between rounded-t-xl border border-b-0 px-3.5 py-1.5 text-xs", children: [_jsx("span", { className: "aui-code-header-language text-muted-foreground font-medium lowercase", children: language }), _jsxs(TooltipIconButton, { tooltip: "Copy", onClick: onCopy, children: [!isCopied && _jsx(CopyIcon, {}), isCopied && _jsx(CheckIcon, {})] })] }));
|
|
26
|
+
};
|
|
27
|
+
const defaultComponents = memoizeMarkdownComponents({
|
|
28
|
+
h1: ({ className, ...props }) => (_jsx("h1", { className: cn("aui-md-h1 mt-5 mb-2 scroll-m-20 text-xl font-semibold first:mt-0 last:mb-0", className), ...props })),
|
|
29
|
+
h2: ({ className, ...props }) => (_jsx("h2", { className: cn("aui-md-h2 mt-5 mb-2 scroll-m-20 text-lg font-semibold first:mt-0 last:mb-0", className), ...props })),
|
|
30
|
+
h3: ({ className, ...props }) => (_jsx("h3", { className: cn("aui-md-h3 mt-4 mb-1.5 scroll-m-20 text-base font-semibold first:mt-0 last:mb-0", className), ...props })),
|
|
31
|
+
h4: ({ className, ...props }) => (_jsx("h4", { className: cn("aui-md-h4 mt-3.5 mb-1 scroll-m-20 text-base font-medium first:mt-0 last:mb-0", className), ...props })),
|
|
32
|
+
h5: ({ className, ...props }) => (_jsx("h5", { className: cn("aui-md-h5 mt-3 mb-1 text-sm font-semibold first:mt-0 last:mb-0", className), ...props })),
|
|
33
|
+
h6: ({ className, ...props }) => (_jsx("h6", { className: cn("aui-md-h6 mt-3 mb-1 text-sm font-medium first:mt-0 last:mb-0", className), ...props })),
|
|
34
|
+
p: ({ className, ...props }) => (_jsx("p", { className: cn("aui-md-p my-3 leading-relaxed first:mt-0 last:mb-0", className), ...props })),
|
|
35
|
+
a: ({ className, ...props }) => (_jsx("a", { className: cn("aui-md-a text-primary hover:text-primary/80 underline underline-offset-2", className), ...props })),
|
|
36
|
+
blockquote: ({ className, ...props }) => (_jsx("blockquote", { className: cn("aui-md-blockquote border-muted-foreground/30 text-muted-foreground my-3 border-s-2 ps-4", className), ...props })),
|
|
37
|
+
ul: ({ className, ...props }) => (_jsx("ul", { className: cn("aui-md-ul marker:text-muted-foreground my-3 ms-5 list-disc [&>li]:mt-1", className), ...props })),
|
|
38
|
+
ol: ({ className, ...props }) => (_jsx("ol", { className: cn("aui-md-ol marker:text-muted-foreground my-3 ms-5 list-decimal [&>li]:mt-1", className), ...props })),
|
|
39
|
+
hr: ({ className, ...props }) => (_jsx("hr", { className: cn("aui-md-hr border-muted-foreground/20 my-3", className), ...props })),
|
|
40
|
+
table: ({ className, ...props }) => (_jsx("table", { className: cn("aui-md-table my-3 w-full border-separate border-spacing-0 overflow-y-auto", className), ...props })),
|
|
41
|
+
th: ({ className, ...props }) => (_jsx("th", { className: cn("aui-md-th bg-muted px-3 py-1.5 text-start font-medium first:rounded-ss-lg last:rounded-se-lg [[align=center]]:text-center [[align=right]]:text-right", className), ...props })),
|
|
42
|
+
td: ({ className, ...props }) => (_jsx("td", { className: cn("aui-md-td border-muted-foreground/20 border-s border-b px-3 py-1.5 text-start last:border-e [[align=center]]:text-center [[align=right]]:text-right", className), ...props })),
|
|
43
|
+
tr: ({ className, ...props }) => (_jsx("tr", { className: cn("aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-es-lg [&:last-child>td:last-child]:rounded-ee-lg", className), ...props })),
|
|
44
|
+
li: ({ className, ...props }) => (_jsx("li", { className: cn("aui-md-li leading-relaxed", className), ...props })),
|
|
45
|
+
strong: ({ className, ...props }) => (_jsx("strong", { className: cn("aui-md-strong font-semibold", className), ...props })),
|
|
46
|
+
sup: ({ className, ...props }) => (_jsx("sup", { className: cn("aui-md-sup [&>a]:text-xs [&>a]:no-underline", className), ...props })),
|
|
47
|
+
pre: ({ className, ...props }) => (_jsx("pre", { className: cn("aui-md-pre border-border/50 bg-muted/30 overflow-x-auto rounded-t-none rounded-b-xl border border-t-0 p-3.5 text-[13px] leading-relaxed", className), ...props })),
|
|
48
|
+
code: function Code({ className, ...props }) {
|
|
49
|
+
const isCodeBlock = useIsMarkdownCodeBlock();
|
|
50
|
+
return (_jsx("code", { className: cn(!isCodeBlock &&
|
|
51
|
+
"aui-md-inline-code bg-muted rounded-md px-1.5 py-0.5 font-mono text-[0.85em]", className), ...props }));
|
|
52
|
+
},
|
|
53
|
+
CodeHeader,
|
|
54
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import { type ReasoningMessagePartComponent } from "@assistant-ui/react";
|
|
3
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible";
|
|
4
|
+
declare const reasoningVariants: (props?: ({
|
|
5
|
+
variant?: "outline" | "ghost" | "muted" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export type ReasoningRootProps = Omit<React.ComponentProps<typeof Collapsible>, "open" | "onOpenChange"> & VariantProps<typeof reasoningVariants> & {
|
|
8
|
+
open?: boolean;
|
|
9
|
+
onOpenChange?: (open: boolean) => void;
|
|
10
|
+
defaultOpen?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the reasoning is currently streaming. While `true` the
|
|
13
|
+
* disclosure is held open with a bottom-pinned live preview; when
|
|
14
|
+
* streaming ends it returns to `defaultOpen`, and the first manual
|
|
15
|
+
* toggle takes over the open/close state permanently. The live preview
|
|
16
|
+
* keeps following the newest tokens while the disclosure is open during
|
|
17
|
+
* streaming, even after a manual toggle, and pauses while the reader is
|
|
18
|
+
* scrolled up.
|
|
19
|
+
*/
|
|
20
|
+
streaming?: boolean;
|
|
21
|
+
};
|
|
22
|
+
declare function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen, streaming, children, ...props }: ReasoningRootProps): import("react").JSX.Element;
|
|
23
|
+
declare function ReasoningTrigger({ active, duration, className, ...props }: React.ComponentProps<typeof CollapsibleTrigger> & {
|
|
24
|
+
active?: boolean;
|
|
25
|
+
duration?: number;
|
|
26
|
+
}): import("react").JSX.Element;
|
|
27
|
+
declare function ReasoningContent({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): import("react").JSX.Element;
|
|
28
|
+
declare function ReasoningText({ className, children, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
|
|
29
|
+
declare const Reasoning: ReasoningMessagePartComponent;
|
|
30
|
+
export { Reasoning, ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText };
|
|
31
|
+
//# sourceMappingURL=reasoning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/reasoning.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAiB,KAAK,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAO/F,QAAA,MAAM,iBAAiB;;8EAWrB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,EACxC,MAAM,GAAG,cAAc,CACxB,GACC,YAAY,CAAC,OAAO,iBAAiB,CAAC,GAAG;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEJ,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,sBAAsB,EACpC,WAAmB,EACnB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAsDpB;AAkCD,iBAAS,gBAAgB,CAAC,EACxB,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,+BA2CA;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,+BAmBjD;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BA6DpF;AAID,QAAA,MAAM,SAAS,EAAqC,6BAA6B,CAAC;AAIlF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, memo, useCallback, useContext, useEffect, useLayoutEffect, useRef, useState, } from "react";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { BrainIcon, ChevronDownIcon } from "lucide-react";
|
|
6
|
+
import { useScrollLock } from "@assistant-ui/react";
|
|
7
|
+
import { MarkdownText } from "./markdown-text.js";
|
|
8
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible.js";
|
|
9
|
+
import { cn } from "../../lib/utils.js";
|
|
10
|
+
const ANIMATION_DURATION = 200;
|
|
11
|
+
const ReasoningPreviewContext = createContext(false);
|
|
12
|
+
const reasoningVariants = cva("aui-reasoning-root mb-4 w-full", {
|
|
13
|
+
variants: {
|
|
14
|
+
variant: {
|
|
15
|
+
outline: "rounded-lg border px-3 py-2",
|
|
16
|
+
ghost: "",
|
|
17
|
+
muted: "bg-muted/50 rounded-lg px-3 py-2",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
variant: "outline",
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen = false, streaming, children, ...props }) {
|
|
25
|
+
const collapsibleRef = useRef(null);
|
|
26
|
+
const initialOpenRef = useRef(defaultOpen);
|
|
27
|
+
const [userOpen, setUserOpen] = useState(null);
|
|
28
|
+
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
|
|
29
|
+
const isControlled = controlledOpen !== undefined;
|
|
30
|
+
const isOpen = isControlled
|
|
31
|
+
? controlledOpen
|
|
32
|
+
: (userOpen ?? (streaming || initialOpenRef.current));
|
|
33
|
+
const isPreview = streaming === true && isOpen;
|
|
34
|
+
const prevStreamingRef = useRef(streaming);
|
|
35
|
+
useLayoutEffect(() => {
|
|
36
|
+
if (prevStreamingRef.current === streaming)
|
|
37
|
+
return;
|
|
38
|
+
prevStreamingRef.current = streaming;
|
|
39
|
+
// A streaming transition only animates the panel when the resting state
|
|
40
|
+
// is collapsed; with `defaultOpen` the disclosure stays open across it.
|
|
41
|
+
if (!isControlled && userOpen === null && !initialOpenRef.current) {
|
|
42
|
+
lockScroll();
|
|
43
|
+
}
|
|
44
|
+
}, [streaming, isControlled, userOpen, lockScroll]);
|
|
45
|
+
const handleOpenChange = useCallback((open) => {
|
|
46
|
+
lockScroll();
|
|
47
|
+
if (!isControlled) {
|
|
48
|
+
setUserOpen(open);
|
|
49
|
+
}
|
|
50
|
+
controlledOnOpenChange?.(open);
|
|
51
|
+
}, [lockScroll, isControlled, controlledOnOpenChange]);
|
|
52
|
+
return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "reasoning-root", "data-variant": variant, open: isOpen, onOpenChange: handleOpenChange, className: cn("group/reasoning-root", reasoningVariants({ variant, className })), style: {
|
|
53
|
+
"--animation-duration": `${ANIMATION_DURATION}ms`,
|
|
54
|
+
}, ...props, children: _jsx(ReasoningPreviewContext.Provider, { value: isPreview, children: children }) }));
|
|
55
|
+
}
|
|
56
|
+
function ReasoningFade({ side = "bottom", className, ...props }) {
|
|
57
|
+
if (side === "top") {
|
|
58
|
+
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("aui-reasoning-fade pointer-events-none absolute inset-x-0 top-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
|
|
59
|
+
}
|
|
60
|
+
return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
|
|
61
|
+
}
|
|
62
|
+
function ReasoningTrigger({ active, duration, className, ...props }) {
|
|
63
|
+
const durationText = duration ? ` (${duration}s)` : "";
|
|
64
|
+
return (_jsxs(CollapsibleTrigger, { "data-slot": "reasoning-trigger", className: cn("aui-reasoning-trigger nc-transition-paint group/trigger flex max-w-[75%] origin-left items-center gap-2 py-1.5 text-sm text-muted-foreground hover:text-foreground", className), ...props, children: [_jsx(BrainIcon, { "data-slot": "reasoning-trigger-icon", className: "aui-reasoning-trigger-icon size-4 shrink-0" }), _jsxs("span", { "data-slot": "reasoning-trigger-label", className: "aui-reasoning-trigger-label-wrapper relative inline-block leading-none tabular-nums", children: [_jsxs("span", { children: ["Reasoning", durationText] }), active ? (_jsxs("span", { "aria-hidden": true, "data-slot": "reasoning-trigger-shimmer", className: "aui-reasoning-trigger-shimmer shimmer pointer-events-none absolute inset-0 motion-reduce:animate-none", children: ["Reasoning", durationText] })) : null] }), _jsx(ChevronDownIcon, { "data-slot": "reasoning-trigger-chevron", className: cn("aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0", "transition-transform duration-(--animation-duration) ease-[var(--nc-ease-out-strong)] motion-reduce:transition-none", "-rotate-90", "group-data-open/trigger:rotate-0", "group-data-panel-open/trigger:rotate-0") })] }));
|
|
65
|
+
}
|
|
66
|
+
function ReasoningContent({ className, children, ...props }) {
|
|
67
|
+
const isPreview = useContext(ReasoningPreviewContext);
|
|
68
|
+
return (_jsxs(CollapsibleContent, { "data-slot": "reasoning-content", className: cn("aui-reasoning-content text-muted-foreground relative overflow-hidden text-sm outline-none", "group/collapsible-content", "data-closed:pointer-events-none", className), ...props, children: [_jsx(ReasoningFade, { side: "top" }), children, isPreview ? _jsx(ReasoningFade, {}) : null] }));
|
|
69
|
+
}
|
|
70
|
+
function ReasoningText({ className, children, ...props }) {
|
|
71
|
+
const isPreview = useContext(ReasoningPreviewContext);
|
|
72
|
+
const scrollRef = useRef(null);
|
|
73
|
+
const contentRef = useRef(null);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (!isPreview)
|
|
76
|
+
return;
|
|
77
|
+
const scrollEl = scrollRef.current;
|
|
78
|
+
const contentEl = contentRef.current;
|
|
79
|
+
if (!scrollEl || !contentEl)
|
|
80
|
+
return;
|
|
81
|
+
let pinned = true;
|
|
82
|
+
let lastScrollTop = scrollEl.scrollTop;
|
|
83
|
+
let lastScrollHeight = scrollEl.scrollHeight;
|
|
84
|
+
const isAtBottom = () => Math.abs(scrollEl.scrollHeight - scrollEl.scrollTop - scrollEl.clientHeight) <= 1 ||
|
|
85
|
+
scrollEl.scrollHeight <= scrollEl.clientHeight;
|
|
86
|
+
const pin = () => {
|
|
87
|
+
if (!pinned)
|
|
88
|
+
return;
|
|
89
|
+
scrollEl.scrollTop = scrollEl.scrollHeight;
|
|
90
|
+
};
|
|
91
|
+
// A pin's own scroll event can arrive after new content grew the scroll
|
|
92
|
+
// height and read as "not at bottom"; only an upward move at unchanged
|
|
93
|
+
// scroll height is user intent.
|
|
94
|
+
const onScroll = () => {
|
|
95
|
+
if (isAtBottom()) {
|
|
96
|
+
pinned = true;
|
|
97
|
+
}
|
|
98
|
+
else if (scrollEl.scrollTop < lastScrollTop && scrollEl.scrollHeight === lastScrollHeight) {
|
|
99
|
+
pinned = false;
|
|
100
|
+
}
|
|
101
|
+
lastScrollTop = scrollEl.scrollTop;
|
|
102
|
+
lastScrollHeight = scrollEl.scrollHeight;
|
|
103
|
+
};
|
|
104
|
+
pin();
|
|
105
|
+
scrollEl.addEventListener("scroll", onScroll);
|
|
106
|
+
const observer = new ResizeObserver(pin);
|
|
107
|
+
observer.observe(contentEl);
|
|
108
|
+
return () => {
|
|
109
|
+
scrollEl.removeEventListener("scroll", onScroll);
|
|
110
|
+
observer.disconnect();
|
|
111
|
+
};
|
|
112
|
+
}, [isPreview]);
|
|
113
|
+
return (_jsx("div", { ref: scrollRef, "data-slot": "reasoning-text", className: cn("aui-reasoning-text relative z-0 max-h-64 overflow-y-auto ps-6 pt-2 pb-2 leading-relaxed text-pretty", "nc-transition-opacity", className), ...props, children: _jsx("div", { ref: contentRef, className: "aui-reasoning-text-content space-y-4", children: children }) }));
|
|
114
|
+
}
|
|
115
|
+
const ReasoningImpl = () => _jsx(MarkdownText, {});
|
|
116
|
+
const Reasoning = memo(ReasoningImpl);
|
|
117
|
+
Reasoning.displayName = "Reasoning";
|
|
118
|
+
export { Reasoning, ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MessagePrimitive, type ToolCallMessagePartComponent } from "@assistant-ui/react";
|
|
2
|
+
import { type ComponentType, type FC, type PropsWithChildren } from "react";
|
|
3
|
+
export type ThreadGroupPart = MessagePrimitive.GroupedParts.GroupPart;
|
|
4
|
+
/**
|
|
5
|
+
* Optional component overrides for the thread. `AssistantMessage` and
|
|
6
|
+
* `Welcome` replace whole sections; the remaining slots override how the
|
|
7
|
+
* assistant message renders tool calls and part groups. Tool UIs registered
|
|
8
|
+
* by name (toolkit `render`, `useAssistantDataUI`) take precedence over
|
|
9
|
+
* `ToolFallback`.
|
|
10
|
+
*/
|
|
11
|
+
export type ThreadComponents = {
|
|
12
|
+
AssistantMessage?: ComponentType | undefined;
|
|
13
|
+
Welcome?: ComponentType | undefined;
|
|
14
|
+
ToolFallback?: ToolCallMessagePartComponent | undefined;
|
|
15
|
+
ToolGroup?: ComponentType<PropsWithChildren<{
|
|
16
|
+
group: ThreadGroupPart;
|
|
17
|
+
}>> | undefined;
|
|
18
|
+
ReasoningGroup?: ComponentType<PropsWithChildren<{
|
|
19
|
+
group: ThreadGroupPart;
|
|
20
|
+
}>> | undefined;
|
|
21
|
+
};
|
|
22
|
+
export type ThreadProps = {
|
|
23
|
+
components?: ThreadComponents | undefined;
|
|
24
|
+
};
|
|
25
|
+
export declare const Thread: FC<ThreadProps>;
|
|
26
|
+
//# sourceMappingURL=thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EASL,gBAAgB,EAGhB,KAAK,4BAA4B,EAElC,MAAM,qBAAqB,CAAC;AAe7B,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,EAAE,EACP,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACxD,SAAS,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACrF,cAAc,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAWF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAQlC,CAAC"}
|