diff --git a/app/globals.css b/app/globals.css
index 3b15af669..ad79ed694 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -261,6 +261,34 @@
background-clip: padding-box;
}
+ .chat-card-x-scroll {
+ scrollbar-gutter: stable;
+ scrollbar-width: thin;
+ scrollbar-color: rgba(148, 163, 184, 0.42) rgba(148, 163, 184, 0.14);
+ }
+
+ .chat-card-x-scroll::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+ }
+
+ .chat-card-x-scroll::-webkit-scrollbar-track {
+ background: rgba(148, 163, 184, 0.14);
+ border-radius: 999px;
+ }
+
+ .chat-card-x-scroll::-webkit-scrollbar-thumb {
+ background: rgba(148, 163, 184, 0.42);
+ border: 2px solid transparent;
+ background-clip: padding-box;
+ border-radius: 999px;
+ }
+
+ .chat-card-x-scroll::-webkit-scrollbar-thumb:hover {
+ background: rgba(148, 163, 184, 0.58);
+ background-clip: padding-box;
+ }
+
.step {
counter-increment: step;
}
diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx
index b6e4411c3..d8623820f 100644
--- a/components/canvas/CanvasChatPanel.tsx
+++ b/components/canvas/CanvasChatPanel.tsx
@@ -959,6 +959,11 @@ type CanvasTypewriterTextProps = {
className?: string;
renderMarkdown?: boolean;
preserveMarkdownTables?: boolean;
+ enablePdfDownload?: boolean;
+ pdfFileName?: string;
+ pdfSiteLogo?: string | null;
+ pdfSiteName?: string | null;
+ pdfTitle?: string;
onActiveChange?: (typingKey: string, active: boolean) => void;
onComplete?: (typingKey: string) => void;
};
@@ -1077,6 +1082,11 @@ function CanvasTypewriterText({
className,
renderMarkdown = false,
preserveMarkdownTables = false,
+ enablePdfDownload = false,
+ pdfFileName,
+ pdfSiteLogo,
+ pdfSiteName,
+ pdfTitle,
onActiveChange,
onComplete,
}: CanvasTypewriterTextProps) {
@@ -1131,7 +1141,16 @@ function CanvasTypewriterText({
if (renderMarkdown) {
return (
- {displayText}
+
+ {displayText}
+
{showCursor ? : null}
);
@@ -2995,6 +3014,9 @@ export function CanvasChatPanel({
// 获取网站设置(包含广告横幅配置和画布设置)
const { data: siteSettings } = useSWR<{
+ siteName?: string;
+ siteLogo?: string | null;
+ siteLogoDark?: string | null;
bannerEnabled?: boolean;
bannerText?: string;
bannerLink?: string | null;
@@ -11178,7 +11200,7 @@ export function CanvasChatPanel({
"flex min-w-0 flex-col gap-2",
message.role === 'user'
? "max-w-[88%] items-end"
- : "w-full max-w-[88%] items-start"
+ : "w-full max-w-full items-start"
)}>
{message.role === 'user' ? (
@@ -11415,6 +11442,11 @@ export function CanvasChatPanel({
className="break-words [overflow-wrap:anywhere]"
renderMarkdown
preserveMarkdownTables={shouldTypeClawAssistantMessage}
+ enablePdfDownload={message.role === "assistant" && !shouldAnimatePlainText}
+ pdfFileName={`Claw分析报告-${message.id}`}
+ pdfSiteLogo={siteSettings?.siteLogo || siteSettings?.siteLogoDark || null}
+ pdfSiteName={siteSettings?.siteName || "AI Chatbot"}
+ pdfTitle="Claw 分析报告"
onActiveChange={handleTypewriterActiveChange}
onComplete={handleTypewriterComplete}
/>
diff --git a/components/elements/openclaw-chart-card.tsx b/components/elements/openclaw-chart-card.tsx
index 4081c9831..e758b20f2 100644
--- a/components/elements/openclaw-chart-card.tsx
+++ b/components/elements/openclaw-chart-card.tsx
@@ -306,6 +306,7 @@ export function OpenClawChartCard({ chart }: { chart: OpenClawChartSpec }) {
-
+