diff --git a/packages/copilot-sdk/src/ui/components/composed/chat/default-message.tsx b/packages/copilot-sdk/src/ui/components/composed/chat/default-message.tsx index 75025d0..9ec715d 100644 --- a/packages/copilot-sdk/src/ui/components/composed/chat/default-message.tsx +++ b/packages/copilot-sdk/src/ui/components/composed/chat/default-message.tsx @@ -122,7 +122,7 @@ export function DefaultMessage({ showUserAvatar ? "justify-end" : "justify-end", )} > -
+
{/* Text content */} {message.content && ( { const classNames = cn( - "csdk-message-content rounded-lg p-2 break-words whitespace-normal max-w-none leading-relaxed", + "csdk-message-content rounded-lg p-2 break-words whitespace-normal max-w-full leading-relaxed overflow-x-auto overflow-y-hidden", // Typography - simple Tailwind utilities (no prose) "[&_p]:my-1 [&_p]:leading-relaxed", "[&_ul]:my-1 [&_ul]:pl-4 [&_ul]:list-disc [&_ul]:list-outside", @@ -93,7 +93,9 @@ const MessageContent = ({ "[&_li]:my-0.5 [&_li]:pl-0", "[&_pre]:my-2 [&_blockquote]:my-2 [&_blockquote]:pl-3 [&_blockquote]:border-l-2 [&_blockquote]:border-current/30", "[&_code]:bg-current/10 [&_code]:px-1 [&_code]:rounded [&_code]:text-[0.9em]", - "[&_a]:underline", + "[&_a]:underline [&_a]:text-[var(--csdk-link-color)] [&_a]:[overflow-wrap:anywhere]", + "[&_button[data-streamdown='link']]:underline [&_button[data-streamdown='link']]:text-[var(--csdk-link-color)] [&_button[data-streamdown='link']]:[overflow-wrap:anywhere] [&_button[data-streamdown='link']]:font-medium", + "[&_.text-primary]:text-[var(--csdk-link-color)]", "[&_strong]:font-semibold", textSizeMap[size], className, diff --git a/packages/copilot-sdk/src/ui/styles/base.css b/packages/copilot-sdk/src/ui/styles/base.css index 08e12eb..247c545 100644 --- a/packages/copilot-sdk/src/ui/styles/base.css +++ b/packages/copilot-sdk/src/ui/styles/base.css @@ -33,6 +33,7 @@ --input: hsl(240 5.9% 90%); --ring: hsl(240 5.9% 10%); --radius: 0.5rem; + --csdk-link-color: #2563eb; } .dark { @@ -55,6 +56,7 @@ --border: hsl(240 3.7% 15.9%); --input: hsl(240 3.7% 15.9%); --ring: hsl(240 4.9% 83.9%); + --csdk-link-color: #60a5fa; } } @@ -149,3 +151,39 @@ .csdk-loader-loading-dots { animation: csdk-loading-dots 1.4s infinite; } + +/* Streamdown link-safety-modal (targets streamdown@^2.1.0 internal structure) + * Fixes CSS variable inheritance from parent message context. + * Users can override via --csdk-dialog-foreground and --csdk-dialog-muted-foreground at :root level. + */ + +/* Backdrop: cover full viewport, center the dialog */ +[data-streamdown="link-safety-modal"] { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; +} + +/* Dialog card: reset CSS variables to light defaults, constrain width, apply foreground color */ +[data-streamdown="link-safety-modal"] > div { + --foreground: var(--csdk-dialog-foreground, 240 10% 3.9%); + --muted-foreground: var(--csdk-dialog-muted-foreground, 240 3.8% 46.1%); + max-width: min(500px, 90vw); + margin: 0; + width: 100%; + color: hsl(var(--foreground)); +} + +/* Dark mode override */ +.dark [data-streamdown="link-safety-modal"] > div, +:root.dark [data-streamdown="link-safety-modal"] > div { + --foreground: var(--csdk-dialog-foreground, 0 0% 98%); + --muted-foreground: var(--csdk-dialog-muted-foreground, 0 0% 62.7%); +} + +[data-streamdown="link-safety-modal"] > div .text-muted-foreground { + color: hsl(var(--muted-foreground)); +} + diff --git a/packages/copilot-sdk/src/ui/styles/themes/catppuccin.css b/packages/copilot-sdk/src/ui/styles/themes/catppuccin.css index 1984038..52c8c90 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/catppuccin.css +++ b/packages/copilot-sdk/src/ui/styles/themes/catppuccin.css @@ -30,6 +30,7 @@ --border: hsl(225 14% 77%); --input: hsl(223 16% 83%); --ring: hsl(267 84% 58%); + --csdk-link-color: hsl(220 83% 58%); --radius: 0.35rem; } @@ -66,4 +67,5 @@ --border: hsl(237 16% 23%); --input: hsl(237 16% 23%); --ring: hsl(267 83% 80%); + --csdk-link-color: hsl(220 83% 75%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/claude.css b/packages/copilot-sdk/src/ui/styles/themes/claude.css index 5df4787..e0f18c1 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/claude.css +++ b/packages/copilot-sdk/src/ui/styles/themes/claude.css @@ -29,6 +29,7 @@ --border: hsl(45 8% 84%); --input: hsl(47 6% 69%); --ring: hsl(16 56% 52%); + --csdk-link-color: hsl(210 70% 45%); --radius: 0.5rem; } @@ -65,4 +66,5 @@ --border: hsl(55 5% 23%); --input: hsl(52 5% 31%); --ring: hsl(14 62% 60%); + --csdk-link-color: hsl(210 70% 65%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/linear.css b/packages/copilot-sdk/src/ui/styles/themes/linear.css index 66da176..8f4fd18 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/linear.css +++ b/packages/copilot-sdk/src/ui/styles/themes/linear.css @@ -29,6 +29,7 @@ --border: hsl(260 12% 90%); --input: hsl(260 12% 90%); --ring: hsl(260 75% 50%); + --csdk-link-color: hsl(195 70% 40%); --radius: 0.5rem; } @@ -65,4 +66,5 @@ --border: hsl(260 22% 18%); --input: hsl(260 22% 18%); --ring: hsl(260 65% 58%); + --csdk-link-color: hsl(195 55% 60%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/modern-minimal.css b/packages/copilot-sdk/src/ui/styles/themes/modern-minimal.css index e7297d7..175fce3 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/modern-minimal.css +++ b/packages/copilot-sdk/src/ui/styles/themes/modern-minimal.css @@ -29,6 +29,7 @@ --border: hsl(220 13% 91%); --input: hsl(220 13% 91%); --ring: hsl(217 91% 60%); + --csdk-link-color: hsl(217 91% 60%); --radius: 0.375rem; } @@ -65,4 +66,5 @@ --border: hsl(0 0% 25%); --input: hsl(0 0% 25%); --ring: hsl(217 91% 60%); + --csdk-link-color: hsl(217 91% 65%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/posthog.css b/packages/copilot-sdk/src/ui/styles/themes/posthog.css index 6cca155..92fe247 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/posthog.css +++ b/packages/copilot-sdk/src/ui/styles/themes/posthog.css @@ -31,6 +31,7 @@ --border: hsl(30 15% 20%); --input: hsl(30 15% 20%); --ring: hsl(37 92% 50%); + --csdk-link-color: hsl(37 92% 40%); --radius: 0.625rem; } @@ -67,6 +68,7 @@ --border: hsl(40 30% 65%); --input: hsl(40 30% 65%); --ring: hsl(40 85% 55%); + --csdk-link-color: hsl(40 85% 55%); } /* ═══════════════════════════════════════════════════════════ diff --git a/packages/copilot-sdk/src/ui/styles/themes/supabase.css b/packages/copilot-sdk/src/ui/styles/themes/supabase.css index 2e4b8dc..96c7cb9 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/supabase.css +++ b/packages/copilot-sdk/src/ui/styles/themes/supabase.css @@ -29,6 +29,7 @@ --border: hsl(0 0% 87%); --input: hsl(0 0% 96%); --ring: hsl(153 70% 67%); + --csdk-link-color: hsl(153 60% 38%); --radius: 0.5rem; } @@ -65,4 +66,5 @@ --border: hsl(0 0% 16%); --input: hsl(0 0% 14%); --ring: hsl(142 69% 58%); + --csdk-link-color: hsl(153 70% 50%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/twitter.css b/packages/copilot-sdk/src/ui/styles/themes/twitter.css index 4f03992..58f5c31 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/twitter.css +++ b/packages/copilot-sdk/src/ui/styles/themes/twitter.css @@ -29,6 +29,7 @@ --border: hsl(199 35% 92%); --input: hsl(200 20% 97%); --ring: hsl(204 88% 53%); + --csdk-link-color: hsl(201 89% 43%); --radius: 1.25rem; } @@ -65,4 +66,5 @@ --border: hsl(216 5% 15%); --input: hsl(202 58% 18%); --ring: hsl(204 88% 53%); + --csdk-link-color: hsl(201 89% 63%); } diff --git a/packages/copilot-sdk/src/ui/styles/themes/vercel.css b/packages/copilot-sdk/src/ui/styles/themes/vercel.css index fa383fd..f80f18d 100644 --- a/packages/copilot-sdk/src/ui/styles/themes/vercel.css +++ b/packages/copilot-sdk/src/ui/styles/themes/vercel.css @@ -29,6 +29,7 @@ --border: hsl(0 0% 90%); --input: hsl(0 0% 90%); --ring: hsl(0 0% 0%); + --csdk-link-color: #2563eb; --radius: 0.375rem; } @@ -65,4 +66,5 @@ --border: hsl(0 0% 20%); --input: hsl(0 0% 20%); --ring: hsl(0 0% 100%); + --csdk-link-color: #60a5fa; }