@gram-ai/elements 1.27.4 → 1.27.5
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 +72 -60
- package/README.typedoc.md +6 -6
- package/bin/cli.js +74 -74
- package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
- package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
- package/dist/compat-shims-DxtUrORi.js.map +1 -0
- package/dist/components/ShareButton/index.d.ts +2 -2
- package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
- package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
- package/dist/components/ui/avatar.d.ts +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/calendar.d.ts +1 -1
- package/dist/components/ui/collapsible.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +4 -4
- package/dist/components/ui/popover.d.ts +2 -2
- package/dist/components/ui/skeleton.d.ts +1 -1
- package/dist/components/ui/time-range-picker.d.ts +1 -1
- package/dist/components/ui/tool-ui.d.ts +7 -7
- package/dist/components/ui/tooltip.d.ts +2 -2
- package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
- package/dist/elements.cjs +1 -1
- package/dist/elements.js +2 -2
- package/dist/hooks/useDensity.d.ts +73 -73
- package/dist/hooks/useMCPTools.d.ts +1 -1
- package/dist/hooks/useRadius.d.ts +1 -1
- package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
- package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
- package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
- package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
- package/dist/{index-D0bAYNQy.js → index-DuCQRbcQ.js} +279 -265
- package/dist/index-DuCQRbcQ.js.map +1 -0
- package/dist/{index-KSX4Qjip.cjs → index-y_PNN5vK.cjs} +10 -10
- package/dist/index-y_PNN5vK.cjs.map +1 -0
- package/dist/lib/cassette.d.ts +4 -4
- package/dist/lib/errorTracking.d.ts +1 -1
- package/dist/lib/messageConverter.d.ts +1 -1
- package/dist/lib/models.d.ts +1 -1
- package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
- package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
- package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
- package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.js +1 -1
- package/dist/{profiler-BFkhZRxj.js → profiler-FpBY9eRv.js} +2 -2
- package/dist/{profiler-BFkhZRxj.js.map → profiler-FpBY9eRv.js.map} +1 -1
- package/dist/{profiler-CyzxBxVz.cjs → profiler-_mthyjvo.cjs} +2 -2
- package/dist/{profiler-CyzxBxVz.cjs.map → profiler-_mthyjvo.cjs.map} +1 -1
- package/dist/react-shim.js +1 -1
- package/dist/server/express.cjs.map +1 -1
- package/dist/server/express.js.map +1 -1
- package/dist/{startRecording-Dq92sEHf.cjs → startRecording-NJcpiHw-.cjs} +2 -2
- package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
- package/dist/{startRecording-C-PPAs_Z.js → startRecording-r5MXQ2Dm.js} +2 -2
- package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +1 -5
- package/src/compat-plugin.ts +14 -14
- package/src/compat-shims.ts +33 -31
- package/src/compat.test.ts +48 -48
- package/src/compat.ts +6 -6
- package/src/components/Chat/index.tsx +17 -17
- package/src/components/Chat/stories/Charts.stories.tsx +98 -98
- package/src/components/Chat/stories/Composer.stories.tsx +15 -15
- package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
- package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
- package/src/components/Chat/stories/Density.stories.tsx +20 -20
- package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
- package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
- package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
- package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
- package/src/components/Chat/stories/Modal.stories.tsx +28 -28
- package/src/components/Chat/stories/Model.stories.tsx +11 -11
- package/src/components/Chat/stories/Radius.stories.tsx +20 -20
- package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
- package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
- package/src/components/Chat/stories/Theme.stories.tsx +25 -25
- package/src/components/Chat/stories/Thread.stories.tsx +25 -25
- package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
- package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
- package/src/components/Chat/stories/Tools.stories.tsx +88 -88
- package/src/components/Chat/stories/Variants.stories.tsx +32 -32
- package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
- package/src/components/ChatHistory.tsx +7 -7
- package/src/components/FrontendTools/index.tsx +5 -5
- package/src/components/Replay.stories.tsx +157 -157
- package/src/components/Replay.tsx +76 -73
- package/src/components/ShadowRoot.tsx +40 -40
- package/src/components/ShareButton/index.tsx +32 -32
- package/src/components/assistant-ui/assistant-modal.tsx +92 -87
- package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
- package/src/components/assistant-ui/attachment.tsx +80 -80
- package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
- package/src/components/assistant-ui/error-boundary.tsx +34 -34
- package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
- package/src/components/assistant-ui/markdown-text.tsx +69 -69
- package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
- package/src/components/assistant-ui/message-feedback.tsx +57 -50
- package/src/components/assistant-ui/reasoning.tsx +83 -83
- package/src/components/assistant-ui/thread-list.tsx +45 -45
- package/src/components/assistant-ui/thread.tsx +278 -278
- package/src/components/assistant-ui/tool-fallback.tsx +37 -37
- package/src/components/assistant-ui/tool-group.tsx +26 -26
- package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
- package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
- package/src/components/ui/avatar.tsx +12 -12
- package/src/components/ui/button.tsx +12 -12
- package/src/components/ui/buttonVariants.ts +17 -17
- package/src/components/ui/calendar.tsx +106 -106
- package/src/components/ui/charts.stories.tsx +56 -56
- package/src/components/ui/collapsible.tsx +5 -5
- package/src/components/ui/dialog.tsx +30 -30
- package/src/components/ui/generative-ui.stories.tsx +200 -200
- package/src/components/ui/generative-ui.tsx +26 -26
- package/src/components/ui/popover.tsx +14 -14
- package/src/components/ui/skeleton.tsx +5 -5
- package/src/components/ui/time-range-picker.stories.tsx +80 -80
- package/src/components/ui/time-range-picker.tsx +245 -244
- package/src/components/ui/tool-ui.stories.tsx +37 -37
- package/src/components/ui/tool-ui.tsx +221 -215
- package/src/components/ui/tooltip.tsx +15 -15
- package/src/constants/tailwind.ts +1 -1
- package/src/contexts/ChatIdContext.tsx +7 -7
- package/src/contexts/ConnectionStatusContext.tsx +64 -64
- package/src/contexts/ElementsProvider.tsx +214 -213
- package/src/contexts/ReplayContext.ts +3 -3
- package/src/contexts/ToolApprovalContext.tsx +54 -54
- package/src/contexts/ToolExecutionContext.tsx +34 -34
- package/src/contexts/contexts.ts +7 -7
- package/src/contexts/portal-container-context.ts +2 -2
- package/src/contexts/portal-container.tsx +7 -7
- package/src/embedded.ts +1 -1
- package/src/global.css +25 -25
- package/src/hooks/useAuth.ts +72 -72
- package/src/hooks/useDensity.ts +79 -79
- package/src/hooks/useElements.ts +6 -6
- package/src/hooks/useExpanded.ts +12 -12
- package/src/hooks/useFollowOnSuggestions.ts +83 -83
- package/src/hooks/useGramThreadListAdapter.tsx +99 -99
- package/src/hooks/useMCPTools.ts +47 -47
- package/src/hooks/useModel.ts +14 -14
- package/src/hooks/usePluginComponents.ts +11 -11
- package/src/hooks/usePortalContainer.ts +5 -5
- package/src/hooks/useRadius.ts +23 -23
- package/src/hooks/useRecordCassette.ts +34 -34
- package/src/hooks/useSession.ts +11 -11
- package/src/hooks/useThemeProps.ts +13 -13
- package/src/hooks/useThreadId.ts +4 -4
- package/src/hooks/useToolApproval.ts +7 -7
- package/src/hooks/useToolMentions.ts +40 -40
- package/src/index.ts +26 -26
- package/src/lib/api.test.ts +61 -61
- package/src/lib/api.ts +4 -3
- package/src/lib/auth.ts +13 -13
- package/src/lib/cassette.ts +84 -84
- package/src/lib/easing.ts +1 -1
- package/src/lib/errorTracking.config.ts +5 -5
- package/src/lib/errorTracking.ts +29 -29
- package/src/lib/generative-ui.ts +7 -7
- package/src/lib/humanize.ts +3 -3
- package/src/lib/messageConverter.test.ts +130 -127
- package/src/lib/messageConverter.ts +196 -196
- package/src/lib/models.ts +21 -20
- package/src/lib/token.test.ts +56 -56
- package/src/lib/token.ts +14 -14
- package/src/lib/tool-mentions.ts +45 -45
- package/src/lib/tools.ts +66 -62
- package/src/lib/utils.ts +5 -5
- package/src/lib.d.ts +1 -1
- package/src/plugins/README.md +5 -5
- package/src/plugins/chart/catalog.ts +18 -18
- package/src/plugins/chart/chart.test.ts +31 -31
- package/src/plugins/chart/component.tsx +34 -34
- package/src/plugins/chart/index.ts +4 -4
- package/src/plugins/chart/ui/area-chart.tsx +42 -42
- package/src/plugins/chart/ui/bar-chart.tsx +46 -46
- package/src/plugins/chart/ui/donut-chart.tsx +48 -48
- package/src/plugins/chart/ui/index.ts +7 -7
- package/src/plugins/chart/ui/line-chart.tsx +43 -43
- package/src/plugins/chart/ui/pie-chart.tsx +44 -44
- package/src/plugins/chart/ui/radar-chart.tsx +33 -33
- package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
- package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
- package/src/plugins/components/PluginLoadingState.tsx +10 -10
- package/src/plugins/components/index.ts +1 -1
- package/src/plugins/generative-ui/catalog.ts +54 -54
- package/src/plugins/generative-ui/component.tsx +85 -85
- package/src/plugins/generative-ui/index.ts +4 -4
- package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
- package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
- package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
- package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/alert.tsx +20 -20
- package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
- package/src/plugins/generative-ui/ui/badge.tsx +22 -22
- package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
- package/src/plugins/generative-ui/ui/button.tsx +28 -28
- package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/card.tsx +27 -27
- package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
- package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
- package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
- package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
- package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
- package/src/plugins/generative-ui/ui/grid.tsx +12 -12
- package/src/plugins/generative-ui/ui/index.ts +40 -40
- package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/input.tsx +9 -9
- package/src/plugins/generative-ui/ui/label.tsx +8 -8
- package/src/plugins/generative-ui/ui/list.tsx +11 -11
- package/src/plugins/generative-ui/ui/metric.tsx +23 -23
- package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
- package/src/plugins/generative-ui/ui/popover.tsx +21 -21
- package/src/plugins/generative-ui/ui/progress.tsx +13 -13
- package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
- package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/select.tsx +37 -37
- package/src/plugins/generative-ui/ui/separator.tsx +9 -9
- package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
- package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
- package/src/plugins/generative-ui/ui/stack.tsx +28 -28
- package/src/plugins/generative-ui/ui/switch.tsx +11 -11
- package/src/plugins/generative-ui/ui/table.tsx +32 -32
- package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
- package/src/plugins/generative-ui/ui/text.tsx +12 -12
- package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
- package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
- package/src/plugins/index.ts +7 -7
- package/src/react-shim.ts +6 -6
- package/src/server/bun.ts +12 -12
- package/src/server/core.ts +25 -25
- package/src/server/express.ts +17 -15
- package/src/server/fastify.ts +14 -14
- package/src/server/hono.ts +9 -9
- package/src/server/nextjs.ts +12 -12
- package/src/server/tanstack-start.ts +12 -12
- package/src/server.ts +27 -27
- package/src/storybook.d.ts +4 -4
- package/src/types/index.ts +122 -122
- package/src/types/plugins.ts +7 -7
- package/src/vite-env.d.ts +12 -12
- package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
- package/dist/index-D0bAYNQy.js.map +0 -1
- package/dist/index-KSX4Qjip.cjs.map +0 -1
|
@@ -3,40 +3,40 @@ import {
|
|
|
3
3
|
TooltipContent,
|
|
4
4
|
TooltipProvider,
|
|
5
5
|
TooltipTrigger,
|
|
6
|
-
} from
|
|
7
|
-
import { EASE_OUT_QUINT } from
|
|
8
|
-
import { cn } from
|
|
9
|
-
import { Heart, X } from
|
|
10
|
-
import { AnimatePresence } from
|
|
11
|
-
import * as m from
|
|
12
|
-
import { useState, type FC } from
|
|
6
|
+
} from "@/components/ui/tooltip";
|
|
7
|
+
import { EASE_OUT_QUINT } from "@/lib/easing";
|
|
8
|
+
import { cn } from "@/lib/utils";
|
|
9
|
+
import { Heart, X } from "lucide-react";
|
|
10
|
+
import { AnimatePresence } from "motion/react";
|
|
11
|
+
import * as m from "motion/react-m";
|
|
12
|
+
import { useState, type FC } from "react";
|
|
13
13
|
|
|
14
|
-
export type FeedbackType =
|
|
14
|
+
export type FeedbackType = "dislike" | "like";
|
|
15
15
|
|
|
16
16
|
interface MessageFeedbackProps {
|
|
17
|
-
onFeedback?: (type: FeedbackType) => void
|
|
18
|
-
onResolved?: () => void
|
|
19
|
-
className?: string
|
|
17
|
+
onFeedback?: (type: FeedbackType) => void;
|
|
18
|
+
onResolved?: () => void;
|
|
19
|
+
className?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const feedbackButtons = [
|
|
23
23
|
{
|
|
24
|
-
type:
|
|
24
|
+
type: "like" as const,
|
|
25
25
|
icon: Heart,
|
|
26
|
-
label:
|
|
27
|
-
color:
|
|
28
|
-
hoverBg:
|
|
29
|
-
activeBg:
|
|
26
|
+
label: "This resolved my question",
|
|
27
|
+
color: "text-emerald-500",
|
|
28
|
+
hoverBg: "hover:bg-emerald-500/10",
|
|
29
|
+
activeBg: "bg-emerald-500/20",
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
|
-
type:
|
|
32
|
+
type: "dislike" as const,
|
|
33
33
|
icon: X,
|
|
34
34
|
label: "This didn't help",
|
|
35
|
-
color:
|
|
36
|
-
hoverBg:
|
|
37
|
-
activeBg:
|
|
35
|
+
color: "text-rose-500",
|
|
36
|
+
hoverBg: "hover:bg-rose-500/10",
|
|
37
|
+
activeBg: "bg-rose-500/20",
|
|
38
38
|
},
|
|
39
|
-
]
|
|
39
|
+
];
|
|
40
40
|
|
|
41
41
|
const feedbackStyles = `
|
|
42
42
|
@keyframes subtle-bounce {
|
|
@@ -57,33 +57,35 @@ const feedbackStyles = `
|
|
|
57
57
|
:host(.dark) .aui-feedback-thank-you {
|
|
58
58
|
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.06);
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
`;
|
|
61
61
|
|
|
62
62
|
export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
63
63
|
onFeedback,
|
|
64
64
|
onResolved,
|
|
65
65
|
className,
|
|
66
66
|
}) => {
|
|
67
|
+
const [tooltipContainer, setTooltipContainer] =
|
|
68
|
+
useState<HTMLDivElement | null>(null);
|
|
67
69
|
const [selectedFeedback, setSelectedFeedback] = useState<FeedbackType | null>(
|
|
68
|
-
null
|
|
69
|
-
)
|
|
70
|
-
const [showDislikeFeedback, setShowDislikeFeedback] = useState(false)
|
|
70
|
+
null,
|
|
71
|
+
);
|
|
72
|
+
const [showDislikeFeedback, setShowDislikeFeedback] = useState(false);
|
|
71
73
|
|
|
72
74
|
const handleFeedback = (type: FeedbackType) => {
|
|
73
|
-
setSelectedFeedback(type)
|
|
74
|
-
onFeedback?.(type)
|
|
75
|
-
if (type ===
|
|
76
|
-
onResolved?.()
|
|
75
|
+
setSelectedFeedback(type);
|
|
76
|
+
onFeedback?.(type);
|
|
77
|
+
if (type === "like") {
|
|
78
|
+
onResolved?.();
|
|
77
79
|
} else {
|
|
78
|
-
setShowDislikeFeedback(true)
|
|
80
|
+
setShowDislikeFeedback(true);
|
|
79
81
|
}
|
|
80
|
-
}
|
|
82
|
+
};
|
|
81
83
|
|
|
82
84
|
return (
|
|
83
85
|
<div
|
|
84
86
|
className={cn(
|
|
85
|
-
|
|
86
|
-
className
|
|
87
|
+
"aui-message-feedback flex items-center justify-center",
|
|
88
|
+
className,
|
|
87
89
|
)}
|
|
88
90
|
>
|
|
89
91
|
<style>{feedbackStyles}</style>
|
|
@@ -91,6 +93,7 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
91
93
|
{!showDislikeFeedback ? (
|
|
92
94
|
<m.div
|
|
93
95
|
key="feedback-buttons"
|
|
96
|
+
ref={setTooltipContainer}
|
|
94
97
|
className="aui-feedback-buttons relative flex items-center gap-1.5 rounded-full border border-black/[0.08] bg-gradient-to-b from-white/80 to-white/60 px-3 py-1 backdrop-blur-2xl dark:border-white/5 dark:from-white/10 dark:to-white/[0.03]"
|
|
95
98
|
initial={{ opacity: 0, scale: 0.8, y: 10 }}
|
|
96
99
|
animate={{ opacity: 1, scale: 1, y: 0 }}
|
|
@@ -99,7 +102,7 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
99
102
|
>
|
|
100
103
|
<TooltipProvider delayDuration={300}>
|
|
101
104
|
{feedbackButtons.map((button, index) => {
|
|
102
|
-
const Icon = button.icon
|
|
105
|
+
const Icon = button.icon;
|
|
103
106
|
return (
|
|
104
107
|
<Tooltip key={button.type}>
|
|
105
108
|
<TooltipTrigger asChild>
|
|
@@ -107,9 +110,9 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
107
110
|
type="button"
|
|
108
111
|
onClick={() => handleFeedback(button.type)}
|
|
109
112
|
className={cn(
|
|
110
|
-
|
|
113
|
+
"group/btn relative flex size-8 items-center justify-center rounded-full transition-[background-color] duration-200 ease-out",
|
|
111
114
|
button.hoverBg,
|
|
112
|
-
selectedFeedback === button.type && button.activeBg
|
|
115
|
+
selectedFeedback === button.type && button.activeBg,
|
|
113
116
|
)}
|
|
114
117
|
initial="initial"
|
|
115
118
|
animate="animate"
|
|
@@ -123,7 +126,7 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
123
126
|
transition={{
|
|
124
127
|
duration: 0.8,
|
|
125
128
|
delay: 0.75 + index * 0.15,
|
|
126
|
-
type:
|
|
129
|
+
type: "spring",
|
|
127
130
|
stiffness: 150,
|
|
128
131
|
damping: 10,
|
|
129
132
|
}}
|
|
@@ -132,43 +135,47 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
132
135
|
<span
|
|
133
136
|
className="flex"
|
|
134
137
|
style={{
|
|
135
|
-
animation:
|
|
138
|
+
animation: "none",
|
|
136
139
|
}}
|
|
137
140
|
onMouseEnter={(e) => {
|
|
138
141
|
e.currentTarget.style.animation =
|
|
139
|
-
|
|
142
|
+
"subtle-bounce 0.6s ease-in-out infinite";
|
|
140
143
|
}}
|
|
141
144
|
onMouseLeave={(e) => {
|
|
142
|
-
e.currentTarget.style.animation =
|
|
145
|
+
e.currentTarget.style.animation = "none";
|
|
143
146
|
}}
|
|
144
147
|
>
|
|
145
148
|
<Icon
|
|
146
149
|
className={cn(
|
|
147
|
-
|
|
150
|
+
"size-5 transition-[fill] duration-200",
|
|
148
151
|
button.color,
|
|
149
|
-
button.type ===
|
|
150
|
-
|
|
152
|
+
button.type === "like" &&
|
|
153
|
+
"group-hover/btn:fill-emerald-500",
|
|
151
154
|
selectedFeedback === button.type &&
|
|
152
|
-
button.type ===
|
|
153
|
-
|
|
155
|
+
button.type === "like" &&
|
|
156
|
+
"fill-emerald-500",
|
|
154
157
|
)}
|
|
155
158
|
strokeWidth={2}
|
|
156
159
|
/>
|
|
157
160
|
</span>
|
|
158
161
|
</m.button>
|
|
159
162
|
</TooltipTrigger>
|
|
160
|
-
<TooltipContent
|
|
163
|
+
<TooltipContent
|
|
164
|
+
side="top"
|
|
165
|
+
sideOffset={8}
|
|
166
|
+
container={tooltipContainer}
|
|
167
|
+
>
|
|
161
168
|
{button.label}
|
|
162
169
|
</TooltipContent>
|
|
163
170
|
</Tooltip>
|
|
164
|
-
)
|
|
171
|
+
);
|
|
165
172
|
})}
|
|
166
173
|
</TooltipProvider>
|
|
167
174
|
</m.div>
|
|
168
175
|
) : (
|
|
169
176
|
<m.div
|
|
170
177
|
key="thank-you"
|
|
171
|
-
className="aui-feedback-thank-you
|
|
178
|
+
className="aui-feedback-thank-you rounded-full border border-black/[0.08] bg-gradient-to-b from-white/80 to-white/60 px-4 py-2 text-sm text-muted-foreground backdrop-blur-2xl dark:border-white/5 dark:from-white/10 dark:to-white/[0.03]"
|
|
172
179
|
initial={{ opacity: 0, y: 5 }}
|
|
173
180
|
animate={{ opacity: 1, y: 0 }}
|
|
174
181
|
transition={{ duration: 0.25, ease: EASE_OUT_QUINT }}
|
|
@@ -178,5 +185,5 @@ export const MessageFeedback: FC<MessageFeedbackProps> = ({
|
|
|
178
185
|
)}
|
|
179
186
|
</AnimatePresence>
|
|
180
187
|
</div>
|
|
181
|
-
)
|
|
182
|
-
}
|
|
188
|
+
);
|
|
189
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { BrainIcon, ChevronDownIcon } from
|
|
3
|
+
import { BrainIcon, ChevronDownIcon } from "lucide-react";
|
|
4
4
|
import {
|
|
5
5
|
memo,
|
|
6
6
|
useCallback,
|
|
@@ -8,24 +8,24 @@ import {
|
|
|
8
8
|
useState,
|
|
9
9
|
type FC,
|
|
10
10
|
type PropsWithChildren,
|
|
11
|
-
} from
|
|
11
|
+
} from "react";
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
14
|
useAssistantState,
|
|
15
15
|
useScrollLock,
|
|
16
16
|
type ReasoningGroupComponent,
|
|
17
17
|
type ReasoningMessagePartComponent,
|
|
18
|
-
} from
|
|
18
|
+
} from "@assistant-ui/react";
|
|
19
19
|
|
|
20
|
-
import { MarkdownText } from
|
|
20
|
+
import { MarkdownText } from "@/components/assistant-ui/markdown-text";
|
|
21
21
|
import {
|
|
22
22
|
Collapsible,
|
|
23
23
|
CollapsibleContent,
|
|
24
24
|
CollapsibleTrigger,
|
|
25
|
-
} from
|
|
26
|
-
import { cn } from
|
|
25
|
+
} from "@/components/ui/collapsible";
|
|
26
|
+
import { cn } from "@/lib/utils";
|
|
27
27
|
|
|
28
|
-
const ANIMATION_DURATION = 200
|
|
28
|
+
const ANIMATION_DURATION = 200;
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Root collapsible container that manages open/closed state and scroll lock.
|
|
@@ -33,41 +33,41 @@ const ANIMATION_DURATION = 200
|
|
|
33
33
|
*/
|
|
34
34
|
const ReasoningRoot: FC<
|
|
35
35
|
PropsWithChildren<{
|
|
36
|
-
className?: string
|
|
36
|
+
className?: string;
|
|
37
37
|
}>
|
|
38
38
|
> = ({ className, children }) => {
|
|
39
|
-
const collapsibleRef = useRef<HTMLDivElement>(null)
|
|
40
|
-
const [isOpen, setIsOpen] = useState(false)
|
|
41
|
-
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION)
|
|
39
|
+
const collapsibleRef = useRef<HTMLDivElement>(null);
|
|
40
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
41
|
+
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
|
|
42
42
|
|
|
43
43
|
const handleOpenChange = useCallback(
|
|
44
44
|
(open: boolean) => {
|
|
45
45
|
if (!open) {
|
|
46
|
-
lockScroll()
|
|
46
|
+
lockScroll();
|
|
47
47
|
}
|
|
48
|
-
setIsOpen(open)
|
|
48
|
+
setIsOpen(open);
|
|
49
49
|
},
|
|
50
|
-
[lockScroll]
|
|
51
|
-
)
|
|
50
|
+
[lockScroll],
|
|
51
|
+
);
|
|
52
52
|
|
|
53
53
|
return (
|
|
54
54
|
<Collapsible
|
|
55
55
|
ref={collapsibleRef}
|
|
56
56
|
open={isOpen}
|
|
57
57
|
onOpenChange={handleOpenChange}
|
|
58
|
-
className={cn(
|
|
58
|
+
className={cn("aui-reasoning-root mb-4 w-full", className)}
|
|
59
59
|
style={
|
|
60
60
|
{
|
|
61
|
-
|
|
61
|
+
"--animation-duration": `${ANIMATION_DURATION}ms`,
|
|
62
62
|
} as React.CSSProperties
|
|
63
63
|
}
|
|
64
64
|
>
|
|
65
65
|
{children}
|
|
66
66
|
</Collapsible>
|
|
67
|
-
)
|
|
68
|
-
}
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
69
|
|
|
70
|
-
ReasoningRoot.displayName =
|
|
70
|
+
ReasoningRoot.displayName = "ReasoningRoot";
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
73
|
* Gradient overlay that softens the bottom edge during expand/collapse animations.
|
|
@@ -76,19 +76,19 @@ ReasoningRoot.displayName = 'ReasoningRoot'
|
|
|
76
76
|
const GradientFade: FC<{ className?: string }> = ({ className }) => (
|
|
77
77
|
<div
|
|
78
78
|
className={cn(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
className
|
|
79
|
+
"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16",
|
|
80
|
+
"bg-[linear-gradient(to_top,var(--color-background),transparent)]",
|
|
81
|
+
"animate-in fade-in-0",
|
|
82
|
+
"group-data-[state=open]/collapsible-content:animate-out",
|
|
83
|
+
"group-data-[state=open]/collapsible-content:fade-out-0",
|
|
84
|
+
"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]", // calc for timing the delay
|
|
85
|
+
"group-data-[state=open]/collapsible-content:fill-mode-forwards",
|
|
86
|
+
"duration-(--animation-duration)",
|
|
87
|
+
"group-data-[state=open]/collapsible-content:duration-(--animation-duration)",
|
|
88
|
+
className,
|
|
89
89
|
)}
|
|
90
90
|
/>
|
|
91
|
-
)
|
|
91
|
+
);
|
|
92
92
|
|
|
93
93
|
/**
|
|
94
94
|
* Trigger button for the Reasoning collapsible.
|
|
@@ -100,9 +100,9 @@ const ReasoningTrigger: FC<{ active: boolean; className?: string }> = ({
|
|
|
100
100
|
}) => (
|
|
101
101
|
<CollapsibleTrigger
|
|
102
102
|
className={cn(
|
|
103
|
-
|
|
103
|
+
"aui-reasoning-trigger group/trigger -mb-2 flex max-w-[75%] items-center gap-2 py-2 text-sm text-muted-foreground transition-colors hover:text-foreground",
|
|
104
104
|
className,
|
|
105
|
-
active &&
|
|
105
|
+
active && "shimmer",
|
|
106
106
|
)}
|
|
107
107
|
>
|
|
108
108
|
<BrainIcon className="aui-reasoning-trigger-icon size-4 shrink-0" />
|
|
@@ -111,7 +111,7 @@ const ReasoningTrigger: FC<{ active: boolean; className?: string }> = ({
|
|
|
111
111
|
{active ? (
|
|
112
112
|
<span
|
|
113
113
|
aria-hidden
|
|
114
|
-
className="aui-reasoning-trigger-shimmer
|
|
114
|
+
className="aui-reasoning-trigger-shimmer pointer-events-none absolute inset-0 shimmer motion-reduce:animate-none"
|
|
115
115
|
>
|
|
116
116
|
Reasoning
|
|
117
117
|
</span>
|
|
@@ -119,14 +119,14 @@ const ReasoningTrigger: FC<{ active: boolean; className?: string }> = ({
|
|
|
119
119
|
</span>
|
|
120
120
|
<ChevronDownIcon
|
|
121
121
|
className={cn(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0",
|
|
123
|
+
"transition-transform duration-(--animation-duration) ease-out",
|
|
124
|
+
"group-data-[state=closed]/trigger:-rotate-90",
|
|
125
|
+
"group-data-[state=open]/trigger:rotate-0",
|
|
126
126
|
)}
|
|
127
127
|
/>
|
|
128
128
|
</CollapsibleTrigger>
|
|
129
|
-
)
|
|
129
|
+
);
|
|
130
130
|
|
|
131
131
|
/**
|
|
132
132
|
* Collapsible content wrapper that handles height expand/collapse animation.
|
|
@@ -135,30 +135,30 @@ const ReasoningTrigger: FC<{ active: boolean; className?: string }> = ({
|
|
|
135
135
|
*/
|
|
136
136
|
const ReasoningContent: FC<
|
|
137
137
|
PropsWithChildren<{
|
|
138
|
-
className?: string
|
|
139
|
-
|
|
138
|
+
className?: string;
|
|
139
|
+
"aria-busy"?: boolean;
|
|
140
140
|
}>
|
|
141
|
-
> = ({ className, children,
|
|
141
|
+
> = ({ className, children, "aria-busy": ariaBusy }) => (
|
|
142
142
|
<CollapsibleContent
|
|
143
143
|
className={cn(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
className
|
|
144
|
+
"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none",
|
|
145
|
+
"group/collapsible-content ease-out",
|
|
146
|
+
"data-[state=closed]:animate-collapsible-up",
|
|
147
|
+
"data-[state=open]:animate-collapsible-down",
|
|
148
|
+
"data-[state=closed]:fill-mode-forwards",
|
|
149
|
+
"data-[state=closed]:pointer-events-none",
|
|
150
|
+
"data-[state=open]:duration-(--animation-duration)",
|
|
151
|
+
"data-[state=closed]:duration-(--animation-duration)",
|
|
152
|
+
className,
|
|
153
153
|
)}
|
|
154
154
|
aria-busy={ariaBusy}
|
|
155
155
|
>
|
|
156
156
|
{children}
|
|
157
157
|
<GradientFade />
|
|
158
158
|
</CollapsibleContent>
|
|
159
|
-
)
|
|
159
|
+
);
|
|
160
160
|
|
|
161
|
-
ReasoningContent.displayName =
|
|
161
|
+
ReasoningContent.displayName = "ReasoningContent";
|
|
162
162
|
|
|
163
163
|
/**
|
|
164
164
|
* Text content wrapper that animates the reasoning text visibility.
|
|
@@ -167,30 +167,30 @@ ReasoningContent.displayName = 'ReasoningContent'
|
|
|
167
167
|
*/
|
|
168
168
|
const ReasoningText: FC<
|
|
169
169
|
PropsWithChildren<{
|
|
170
|
-
className?: string
|
|
170
|
+
className?: string;
|
|
171
171
|
}>
|
|
172
172
|
> = ({ className, children }) => (
|
|
173
173
|
<div
|
|
174
174
|
className={cn(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
className
|
|
175
|
+
"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed",
|
|
176
|
+
"transform-gpu transition-[transform,opacity]",
|
|
177
|
+
"group-data-[state=open]/collapsible-content:animate-in",
|
|
178
|
+
"group-data-[state=closed]/collapsible-content:animate-out",
|
|
179
|
+
"group-data-[state=open]/collapsible-content:fade-in-0",
|
|
180
|
+
"group-data-[state=closed]/collapsible-content:fade-out-0",
|
|
181
|
+
"group-data-[state=open]/collapsible-content:slide-in-from-top-4",
|
|
182
|
+
"group-data-[state=closed]/collapsible-content:slide-out-to-top-4",
|
|
183
|
+
"group-data-[state=open]/collapsible-content:duration-(--animation-duration)",
|
|
184
|
+
"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)",
|
|
185
|
+
"[&_p]:-mb-2",
|
|
186
|
+
className,
|
|
187
187
|
)}
|
|
188
188
|
>
|
|
189
189
|
{children}
|
|
190
190
|
</div>
|
|
191
|
-
)
|
|
191
|
+
);
|
|
192
192
|
|
|
193
|
-
ReasoningText.displayName =
|
|
193
|
+
ReasoningText.displayName = "ReasoningText";
|
|
194
194
|
|
|
195
195
|
/**
|
|
196
196
|
* Renders a single reasoning part's text with markdown support.
|
|
@@ -208,7 +208,7 @@ ReasoningText.displayName = 'ReasoningText'
|
|
|
208
208
|
* />
|
|
209
209
|
* ```
|
|
210
210
|
*/
|
|
211
|
-
const ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText
|
|
211
|
+
const ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;
|
|
212
212
|
|
|
213
213
|
/**
|
|
214
214
|
* Collapsible wrapper that groups consecutive reasoning parts together.
|
|
@@ -235,13 +235,13 @@ const ReasoningGroupImpl: ReasoningGroupComponent = ({
|
|
|
235
235
|
* Detects if reasoning is currently streaming within this group's range.
|
|
236
236
|
*/
|
|
237
237
|
const isReasoningStreaming = useAssistantState(({ message }) => {
|
|
238
|
-
if (message.status?.type !==
|
|
239
|
-
const lastIndex = message.parts.length - 1
|
|
240
|
-
if (lastIndex < 0) return false
|
|
241
|
-
const lastType = message.parts[lastIndex]?.type
|
|
242
|
-
if (lastType !==
|
|
243
|
-
return lastIndex >= startIndex && lastIndex <= endIndex
|
|
244
|
-
})
|
|
238
|
+
if (message.status?.type !== "running") return false;
|
|
239
|
+
const lastIndex = message.parts.length - 1;
|
|
240
|
+
if (lastIndex < 0) return false;
|
|
241
|
+
const lastType = message.parts[lastIndex]?.type;
|
|
242
|
+
if (lastType !== "reasoning") return false;
|
|
243
|
+
return lastIndex >= startIndex && lastIndex <= endIndex;
|
|
244
|
+
});
|
|
245
245
|
|
|
246
246
|
return (
|
|
247
247
|
<ReasoningRoot>
|
|
@@ -251,11 +251,11 @@ const ReasoningGroupImpl: ReasoningGroupComponent = ({
|
|
|
251
251
|
<ReasoningText>{children}</ReasoningText>
|
|
252
252
|
</ReasoningContent>
|
|
253
253
|
</ReasoningRoot>
|
|
254
|
-
)
|
|
255
|
-
}
|
|
254
|
+
);
|
|
255
|
+
};
|
|
256
256
|
|
|
257
|
-
export const Reasoning = memo(ReasoningImpl)
|
|
258
|
-
Reasoning.displayName =
|
|
257
|
+
export const Reasoning = memo(ReasoningImpl);
|
|
258
|
+
Reasoning.displayName = "Reasoning";
|
|
259
259
|
|
|
260
|
-
export const ReasoningGroup = memo(ReasoningGroupImpl)
|
|
261
|
-
ReasoningGroup.displayName =
|
|
260
|
+
export const ReasoningGroup = memo(ReasoningGroupImpl);
|
|
261
|
+
ReasoningGroup.displayName = "ReasoningGroup";
|