@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
|
@@ -1,92 +1,97 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { useMemo, useState, type FC } from
|
|
3
|
+
import { useMemo, useState, type FC } from "react";
|
|
4
4
|
import {
|
|
5
5
|
Loader,
|
|
6
6
|
Maximize,
|
|
7
7
|
MessageCircleIcon,
|
|
8
8
|
Minimize,
|
|
9
9
|
XIcon,
|
|
10
|
-
} from
|
|
11
|
-
import {
|
|
12
|
-
|
|
10
|
+
} from "lucide-react";
|
|
11
|
+
import {
|
|
12
|
+
LazyMotion,
|
|
13
|
+
domMax,
|
|
14
|
+
AnimatePresence,
|
|
15
|
+
MotionConfig,
|
|
16
|
+
} from "motion/react";
|
|
17
|
+
import * as m from "motion/react-m";
|
|
13
18
|
|
|
14
|
-
import { ErrorBoundary } from
|
|
15
|
-
import { Thread } from
|
|
16
|
-
import { ThreadList } from
|
|
17
|
-
import { useThemeProps } from
|
|
18
|
-
import { useRadius } from
|
|
19
|
-
import { useDensity } from
|
|
20
|
-
import { assertNever, cn } from
|
|
21
|
-
import { useElements } from
|
|
22
|
-
import { useExpanded } from
|
|
23
|
-
import { EASE_OUT_QUINT } from
|
|
24
|
-
import { useAssistantState } from
|
|
19
|
+
import { ErrorBoundary } from "@/components/assistant-ui/error-boundary";
|
|
20
|
+
import { Thread } from "@/components/assistant-ui/thread";
|
|
21
|
+
import { ThreadList } from "@/components/assistant-ui/thread-list";
|
|
22
|
+
import { useThemeProps } from "@/hooks/useThemeProps";
|
|
23
|
+
import { useRadius } from "@/hooks/useRadius";
|
|
24
|
+
import { useDensity } from "@/hooks/useDensity";
|
|
25
|
+
import { assertNever, cn } from "@/lib/utils";
|
|
26
|
+
import { useElements } from "@/hooks/useElements";
|
|
27
|
+
import { useExpanded } from "@/hooks/useExpanded";
|
|
28
|
+
import { EASE_OUT_QUINT } from "@/lib/easing";
|
|
29
|
+
import { useAssistantState } from "@assistant-ui/react";
|
|
25
30
|
|
|
26
31
|
const LAYOUT_TRANSITION = {
|
|
27
32
|
layout: {
|
|
28
33
|
duration: 0.25,
|
|
29
34
|
ease: EASE_OUT_QUINT,
|
|
30
35
|
},
|
|
31
|
-
} as const
|
|
36
|
+
} as const;
|
|
32
37
|
|
|
33
38
|
type Dimensions = {
|
|
34
|
-
width?: string | number | `${number}
|
|
35
|
-
height?: string | number | `${number}
|
|
36
|
-
maxHeight?: string | number | `${number}
|
|
37
|
-
}
|
|
39
|
+
width?: string | number | `${number}%`;
|
|
40
|
+
height?: string | number | `${number}%`;
|
|
41
|
+
maxHeight?: string | number | `${number}%`;
|
|
42
|
+
};
|
|
38
43
|
|
|
39
44
|
interface AssistantModalProps {
|
|
40
|
-
className?: string
|
|
45
|
+
className?: string;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
44
|
-
const { config } = useElements()
|
|
45
|
-
const themeProps = useThemeProps()
|
|
46
|
-
const r = useRadius()
|
|
47
|
-
const d = useDensity()
|
|
48
|
-
const [isOpen, setIsOpen] = useState(config.modal?.defaultOpen ?? false)
|
|
49
|
-
const { expandable, isExpanded, setIsExpanded } = useExpanded()
|
|
50
|
-
const title = config.modal?.title
|
|
51
|
-
const customIcon = config.modal?.icon
|
|
49
|
+
const { config } = useElements();
|
|
50
|
+
const themeProps = useThemeProps();
|
|
51
|
+
const r = useRadius();
|
|
52
|
+
const d = useDensity();
|
|
53
|
+
const [isOpen, setIsOpen] = useState(config.modal?.defaultOpen ?? false);
|
|
54
|
+
const { expandable, isExpanded, setIsExpanded } = useExpanded();
|
|
55
|
+
const title = config.modal?.title;
|
|
56
|
+
const customIcon = config.modal?.icon;
|
|
52
57
|
|
|
53
58
|
// Check if thread list should be shown
|
|
54
59
|
const showThreadList =
|
|
55
|
-
config.history?.enabled && config.history?.showThreadList !== false
|
|
60
|
+
config.history?.enabled && config.history?.showThreadList !== false;
|
|
56
61
|
|
|
57
|
-
const position = config.modal?.position ??
|
|
58
|
-
const anchorPositionClass = positionClassname(position)
|
|
62
|
+
const position = config.modal?.position ?? "bottom-right";
|
|
63
|
+
const anchorPositionClass = positionClassname(position);
|
|
59
64
|
|
|
60
65
|
const defaultDimensions: Dimensions = useMemo(
|
|
61
66
|
() =>
|
|
62
67
|
config.modal?.dimensions?.default ?? {
|
|
63
|
-
width:
|
|
64
|
-
height:
|
|
65
|
-
maxHeight:
|
|
68
|
+
width: "500px",
|
|
69
|
+
height: "600px",
|
|
70
|
+
maxHeight: "95vh",
|
|
66
71
|
},
|
|
67
|
-
[config.modal?.dimensions?.default]
|
|
68
|
-
)
|
|
72
|
+
[config.modal?.dimensions?.default],
|
|
73
|
+
);
|
|
69
74
|
|
|
70
75
|
const expandedDimensions: Dimensions = useMemo(
|
|
71
76
|
() =>
|
|
72
77
|
config.modal?.dimensions?.expanded ?? {
|
|
73
|
-
width:
|
|
74
|
-
height:
|
|
78
|
+
width: "70vw",
|
|
79
|
+
height: "90vh",
|
|
75
80
|
},
|
|
76
|
-
[config.modal?.dimensions?.expanded]
|
|
77
|
-
)
|
|
78
|
-
const thread = useAssistantState(({ thread }) => thread)
|
|
81
|
+
[config.modal?.dimensions?.expanded],
|
|
82
|
+
);
|
|
83
|
+
const thread = useAssistantState(({ thread }) => thread);
|
|
79
84
|
const isGenerating =
|
|
80
|
-
thread?.messages?.some((message) => message.status?.type ===
|
|
81
|
-
false
|
|
85
|
+
thread?.messages?.some((message) => message.status?.type === "running") ??
|
|
86
|
+
false;
|
|
82
87
|
|
|
83
88
|
const effectiveWidth = isExpanded
|
|
84
89
|
? expandedDimensions.width
|
|
85
|
-
: defaultDimensions.width
|
|
90
|
+
: defaultDimensions.width;
|
|
86
91
|
const effectiveHeight = isExpanded
|
|
87
92
|
? expandedDimensions.height
|
|
88
|
-
: defaultDimensions.height
|
|
89
|
-
const effectiveMaxHeight = defaultDimensions.maxHeight
|
|
93
|
+
: defaultDimensions.height;
|
|
94
|
+
const effectiveMaxHeight = defaultDimensions.maxHeight;
|
|
90
95
|
|
|
91
96
|
return (
|
|
92
97
|
<LazyMotion features={domMax}>
|
|
@@ -94,12 +99,12 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
94
99
|
<MotionConfig reducedMotion="user" transition={LAYOUT_TRANSITION}>
|
|
95
100
|
<div
|
|
96
101
|
className={cn(
|
|
97
|
-
|
|
102
|
+
"aui-root aui-modal-anchor fixed z-10",
|
|
98
103
|
anchorPositionClass,
|
|
99
104
|
themeProps.className,
|
|
100
|
-
r(
|
|
101
|
-
isOpen &&
|
|
102
|
-
className
|
|
105
|
+
r("lg"),
|
|
106
|
+
isOpen && "shadow-xl",
|
|
107
|
+
className,
|
|
103
108
|
)}
|
|
104
109
|
>
|
|
105
110
|
<AnimatePresence mode="wait">
|
|
@@ -110,8 +115,8 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
110
115
|
layoutId="chat-container"
|
|
111
116
|
onClick={() => setIsOpen(true)}
|
|
112
117
|
className={cn(
|
|
113
|
-
|
|
114
|
-
r(
|
|
118
|
+
"aui-modal-button flex size-12 cursor-pointer items-center justify-center border bg-primary text-primary-foreground shadow-lg transition-shadow hover:shadow-xl",
|
|
119
|
+
r("full"),
|
|
115
120
|
)}
|
|
116
121
|
initial={false}
|
|
117
122
|
aria-label={`Open ${title}`}
|
|
@@ -125,7 +130,7 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
125
130
|
className="flex size-full items-center justify-center"
|
|
126
131
|
>
|
|
127
132
|
{customIcon ? (
|
|
128
|
-
customIcon(
|
|
133
|
+
customIcon("closed")
|
|
129
134
|
) : (
|
|
130
135
|
<MessageCircleIcon className="size-6" />
|
|
131
136
|
)}
|
|
@@ -137,13 +142,13 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
137
142
|
layout
|
|
138
143
|
layoutId="chat-container"
|
|
139
144
|
className={cn(
|
|
140
|
-
|
|
141
|
-
r(
|
|
145
|
+
"aui-modal-content flex flex-col overflow-hidden border bg-popover text-popover-foreground [&>.aui-thread-root]:bg-inherit",
|
|
146
|
+
r("lg"),
|
|
142
147
|
)}
|
|
143
148
|
initial={false}
|
|
144
149
|
style={{
|
|
145
|
-
originX: position.includes(
|
|
146
|
-
originY: position.includes(
|
|
150
|
+
originX: position.includes("left") ? 0 : 1,
|
|
151
|
+
originY: position.includes("top") ? 0 : 1,
|
|
147
152
|
width: effectiveWidth,
|
|
148
153
|
height: effectiveHeight,
|
|
149
154
|
maxHeight: effectiveMaxHeight,
|
|
@@ -151,9 +156,9 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
151
156
|
>
|
|
152
157
|
<m.div
|
|
153
158
|
className={cn(
|
|
154
|
-
|
|
155
|
-
d(
|
|
156
|
-
d(
|
|
159
|
+
"aui-modal-header flex shrink-0 items-center justify-between border-b",
|
|
160
|
+
d("h-header"),
|
|
161
|
+
d("px-lg"),
|
|
157
162
|
)}
|
|
158
163
|
initial={{ opacity: 0 }}
|
|
159
164
|
animate={{ opacity: 1 }}
|
|
@@ -163,18 +168,18 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
163
168
|
ease: EASE_OUT_QUINT,
|
|
164
169
|
}}
|
|
165
170
|
>
|
|
166
|
-
<div className={cn(
|
|
171
|
+
<div className={cn("flex min-w-0 items-center")}>
|
|
167
172
|
<span
|
|
168
173
|
className={cn(
|
|
169
|
-
|
|
170
|
-
isGenerating &&
|
|
174
|
+
"text-md flex items-center gap-2 truncate font-medium text-foreground",
|
|
175
|
+
isGenerating && "title-shimmer",
|
|
171
176
|
)}
|
|
172
177
|
>
|
|
173
178
|
<span className="truncate">{title}</span>
|
|
174
179
|
|
|
175
180
|
{isGenerating && (
|
|
176
181
|
<Loader
|
|
177
|
-
className="
|
|
182
|
+
className="size-4.5 animate-spin text-muted-foreground"
|
|
178
183
|
strokeWidth={1.25}
|
|
179
184
|
/>
|
|
180
185
|
)}
|
|
@@ -187,11 +192,11 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
187
192
|
type="button"
|
|
188
193
|
onClick={() => setIsExpanded((v) => !v)}
|
|
189
194
|
className={cn(
|
|
190
|
-
|
|
195
|
+
"flex h-8 cursor-pointer items-center rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
|
|
191
196
|
)}
|
|
192
197
|
aria-pressed={isExpanded}
|
|
193
198
|
aria-label={
|
|
194
|
-
isExpanded ?
|
|
199
|
+
isExpanded ? "Collapse assistant" : "Expand assistant"
|
|
195
200
|
}
|
|
196
201
|
>
|
|
197
202
|
{isExpanded ? (
|
|
@@ -209,11 +214,11 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
209
214
|
) : null}
|
|
210
215
|
<button
|
|
211
216
|
onClick={() => {
|
|
212
|
-
setIsOpen(false)
|
|
217
|
+
setIsOpen(false);
|
|
213
218
|
// Optional: reset expansion when closing
|
|
214
|
-
setIsExpanded(false)
|
|
219
|
+
setIsExpanded(false);
|
|
215
220
|
}}
|
|
216
|
-
className="
|
|
221
|
+
className="-mr-1 flex size-8 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
|
|
217
222
|
aria-label={`Close ${title}`}
|
|
218
223
|
>
|
|
219
224
|
<XIcon className="size-4.5" />
|
|
@@ -252,27 +257,27 @@ export const AssistantModal: FC<AssistantModalProps> = ({ className }) => {
|
|
|
252
257
|
</div>
|
|
253
258
|
</MotionConfig>
|
|
254
259
|
</LazyMotion>
|
|
255
|
-
)
|
|
256
|
-
}
|
|
260
|
+
);
|
|
261
|
+
};
|
|
257
262
|
|
|
258
263
|
function positionClassname(
|
|
259
264
|
position:
|
|
260
|
-
|
|
|
261
|
-
|
|
|
262
|
-
|
|
|
263
|
-
|
|
|
264
|
-
| undefined
|
|
265
|
+
| "bottom-right"
|
|
266
|
+
| "bottom-left"
|
|
267
|
+
| "top-right"
|
|
268
|
+
| "top-left"
|
|
269
|
+
| undefined,
|
|
265
270
|
): string {
|
|
266
271
|
switch (position) {
|
|
267
|
-
case
|
|
268
|
-
return
|
|
269
|
-
case
|
|
270
|
-
return
|
|
271
|
-
case
|
|
272
|
-
return
|
|
273
|
-
case
|
|
274
|
-
return
|
|
272
|
+
case "bottom-left":
|
|
273
|
+
return "left-4 bottom-4";
|
|
274
|
+
case "top-right":
|
|
275
|
+
return "right-4 top-4";
|
|
276
|
+
case "top-left":
|
|
277
|
+
return "left-4 top-4";
|
|
278
|
+
case "bottom-right":
|
|
279
|
+
return "right-4 bottom-4";
|
|
275
280
|
default:
|
|
276
|
-
assertNever(position)
|
|
281
|
+
assertNever(position);
|
|
277
282
|
}
|
|
278
283
|
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { type FC } from
|
|
4
|
-
import { Loader, PanelRightClose, PanelRightOpen } from
|
|
5
|
-
import { ErrorBoundary } from
|
|
6
|
-
import { Thread } from
|
|
7
|
-
import { ThreadList } from
|
|
8
|
-
import { TooltipIconButton } from
|
|
9
|
-
import { useThemeProps } from
|
|
10
|
-
import { useElements } from
|
|
11
|
-
import { cn } from
|
|
12
|
-
import { useExpanded } from
|
|
13
|
-
import { LazyMotion, domMax } from
|
|
14
|
-
import * as m from
|
|
15
|
-
import { EASE_OUT_QUINT } from
|
|
16
|
-
import { useAssistantState } from
|
|
3
|
+
import { type FC } from "react";
|
|
4
|
+
import { Loader, PanelRightClose, PanelRightOpen } from "lucide-react";
|
|
5
|
+
import { ErrorBoundary } from "@/components/assistant-ui/error-boundary";
|
|
6
|
+
import { Thread } from "@/components/assistant-ui/thread";
|
|
7
|
+
import { ThreadList } from "@/components/assistant-ui/thread-list";
|
|
8
|
+
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
|
|
9
|
+
import { useThemeProps } from "@/hooks/useThemeProps";
|
|
10
|
+
import { useElements } from "@/hooks/useElements";
|
|
11
|
+
import { cn } from "@/lib/utils";
|
|
12
|
+
import { useExpanded } from "@/hooks/useExpanded";
|
|
13
|
+
import { LazyMotion, domMax } from "motion/react";
|
|
14
|
+
import * as m from "motion/react-m";
|
|
15
|
+
import { EASE_OUT_QUINT } from "@/lib/easing";
|
|
16
|
+
import { useAssistantState } from "@assistant-ui/react";
|
|
17
17
|
|
|
18
18
|
interface AssistantSidecarProps {
|
|
19
|
-
className?: string
|
|
19
|
+
className?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export const AssistantSidecar: FC<AssistantSidecarProps> = ({ className }) => {
|
|
23
|
-
const { config } = useElements()
|
|
24
|
-
const themeProps = useThemeProps()
|
|
25
|
-
const sidecarConfig = config.sidecar ?? {}
|
|
26
|
-
const { title, dimensions } = sidecarConfig
|
|
27
|
-
const { expandable, isExpanded, setIsExpanded } = useExpanded()
|
|
28
|
-
const thread = useAssistantState(({ thread }) => thread)
|
|
23
|
+
const { config } = useElements();
|
|
24
|
+
const themeProps = useThemeProps();
|
|
25
|
+
const sidecarConfig = config.sidecar ?? {};
|
|
26
|
+
const { title, dimensions } = sidecarConfig;
|
|
27
|
+
const { expandable, isExpanded, setIsExpanded } = useExpanded();
|
|
28
|
+
const thread = useAssistantState(({ thread }) => thread);
|
|
29
29
|
const isGenerating = thread.messages.some(
|
|
30
|
-
(message) => message.status?.type ===
|
|
31
|
-
)
|
|
30
|
+
(message) => message.status?.type === "running",
|
|
31
|
+
);
|
|
32
32
|
|
|
33
33
|
// Check if thread list should be shown
|
|
34
34
|
const showThreadList =
|
|
35
|
-
config.history?.enabled && config.history?.showThreadList !== false
|
|
35
|
+
config.history?.enabled && config.history?.showThreadList !== false;
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
38
|
<LazyMotion features={domMax}>
|
|
@@ -40,29 +40,29 @@ export const AssistantSidecar: FC<AssistantSidecarProps> = ({ className }) => {
|
|
|
40
40
|
initial={false}
|
|
41
41
|
animate={{
|
|
42
42
|
width: isExpanded
|
|
43
|
-
? (dimensions?.expanded?.width ??
|
|
44
|
-
: (dimensions?.default?.width ??
|
|
43
|
+
? (dimensions?.expanded?.width ?? "800px")
|
|
44
|
+
: (dimensions?.default?.width ?? "400px"),
|
|
45
45
|
}}
|
|
46
46
|
transition={{ duration: 0.3, ease: EASE_OUT_QUINT }}
|
|
47
47
|
className={cn(
|
|
48
|
-
|
|
48
|
+
"aui-root aui-sidecar fixed top-0 right-0 bottom-0 flex flex-col border-l bg-popover text-popover-foreground",
|
|
49
49
|
themeProps.className,
|
|
50
|
-
className
|
|
50
|
+
className,
|
|
51
51
|
)}
|
|
52
52
|
>
|
|
53
53
|
{/* Header */}
|
|
54
54
|
<div className="aui-sidecar-header flex h-14 shrink-0 items-center justify-between border-b px-4">
|
|
55
55
|
<span
|
|
56
56
|
className={cn(
|
|
57
|
-
|
|
58
|
-
isGenerating &&
|
|
57
|
+
"text-md flex items-center gap-2 font-medium text-foreground",
|
|
58
|
+
isGenerating && "title-shimmer",
|
|
59
59
|
)}
|
|
60
60
|
>
|
|
61
61
|
{title}
|
|
62
62
|
|
|
63
63
|
{isGenerating && (
|
|
64
64
|
<Loader
|
|
65
|
-
className="
|
|
65
|
+
className="size-4.5 animate-spin text-muted-foreground"
|
|
66
66
|
strokeWidth={1.25}
|
|
67
67
|
/>
|
|
68
68
|
)}
|
|
@@ -70,7 +70,7 @@ export const AssistantSidecar: FC<AssistantSidecarProps> = ({ className }) => {
|
|
|
70
70
|
{expandable && (
|
|
71
71
|
<div className="aui-sidecar-header-actions flex items-center gap-1">
|
|
72
72
|
<TooltipIconButton
|
|
73
|
-
tooltip={isExpanded ?
|
|
73
|
+
tooltip={isExpanded ? "Collapse" : "Pop out"}
|
|
74
74
|
variant="ghost"
|
|
75
75
|
className="aui-sidecar-popout size-8"
|
|
76
76
|
onClick={() => setIsExpanded((v) => !v)}
|
|
@@ -103,5 +103,5 @@ export const AssistantSidecar: FC<AssistantSidecarProps> = ({ className }) => {
|
|
|
103
103
|
</div>
|
|
104
104
|
</m.div>
|
|
105
105
|
</LazyMotion>
|
|
106
|
-
)
|
|
107
|
-
}
|
|
106
|
+
);
|
|
107
|
+
};
|