Skip to content

Commit 054d669

Browse files
committed
style(markdown): 优化Markdown组件样式和高亮主题
- 新增className支持,允许自定义Markdown组件样式 - 引入GitHub风格的highlight.js高亮主题,提升代码块展示效果 - 使用cn函数合并类名,增强样式灵活性和可维护性 style(bubbles): 统一对话气泡组件宽度样式 - 为SystemBubble、ThinkingBubble和ToolBubble组件的Collapsible容器添加全宽样式w-full - UserBubble中Markdown组件新增user-bubble类名,优化样式排版 - 统一对话气泡布局,提升整体UI一致性和用户体验
1 parent 3d49a32 commit 054d669

5 files changed

Lines changed: 11 additions & 7 deletions

File tree

packages/vscode-ide-companion/src/webview/components/bubbles/SystemBubble.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default function SystemBubble({ content, meta, shouldConnect = false }: S
1616
const skillDescription = (meta?.skill as { description?: string } | undefined)?.description || content;
1717

1818
return (
19-
<Collapsible open={open} onOpenChange={setOpen} className="relative flex gap-2 mb-3">
19+
<Collapsible open={open} onOpenChange={setOpen} className="relative w-full flex gap-2 mb-3">
2020
<BubbleDot connectToPrev={shouldConnect} className="mt-4" />
2121
<div className="absolute left-0.75 h-full w-px bg-muted-foreground top-6"></div>
2222
<div className="flex-1 min-w-0">

packages/vscode-ide-companion/src/webview/components/bubbles/ThinkingBubble.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default function ThinkingBubble({ content, shouldConnect = false }: Think
1414
const [open, setOpen] = useState(true);
1515

1616
return (
17-
<Collapsible open={open} onOpenChange={setOpen} className="relative flex gap-2 rounded-md mb-3">
17+
<Collapsible open={open} onOpenChange={setOpen} className="relative flex w-full gap-2 rounded-md mb-3">
1818
<BubbleDot connectToPrev={shouldConnect} className="mt-4" />
1919
<div className="absolute left-0.75 h-full w-px bg-muted-foreground top-6"></div>
2020
<div className="flex-1 min-w-0 data-[state=open]:bg-muted">

packages/vscode-ide-companion/src/webview/components/bubbles/ToolBubble.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default function ToolBubble({ content, meta, shouldConnect = false }: Too
5858
}
5959

6060
return (
61-
<Collapsible open={open} onOpenChange={setOpen} className="relative flex gap-2 mb-3">
61+
<Collapsible open={open} onOpenChange={setOpen} className="relative flex w-full gap-2 mb-3">
6262
<BubbleDot variant={isOk ? "success" : "error"} connectToPrev={shouldConnect} className="mt-4" />
6363
<div className="absolute left-0.75 h-full w-px bg-muted-foreground top-6"></div>
6464
<div className="flex-1 min-w-0">

packages/vscode-ide-companion/src/webview/components/bubbles/UserBubble.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export default function UserBubble({ content, meta, onEdit }: UserBubbleProps) {
5454
</div>
5555
)}
5656
<div className="max-w-[85%] bg-primary/25 rounded-lg px-3 py-2">
57-
<Markdown>{content}</Markdown>
57+
<Markdown className="user-bubble">{content}</Markdown>
5858
</div>
5959
<div className="invisible group-hover:visible text-sm mt-1">
6060
<Tooltip>

packages/vscode-ide-companion/src/webview/components/markdown/index.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ import type { Options as MarkdownItOptions } from "markdown-it";
66
import hljs from "highlight.js";
77
// @ts-expect-error -- module does not provide types
88
import taskLists from "markdown-it-task-lists";
9+
import { cn } from "@/webview/lib/utils";
910
import "./index.css";
11+
import "highlight.js/styles/github-dark.css";
12+
import "highlight.js/styles/github.css";
1013

1114
export interface MarkdownProps {
15+
className?: string;
1216
children?: string;
1317
onFileClick?: (filePath: string) => void;
1418
/** When false, do not convert file paths into clickable links. Default: true */
@@ -90,7 +94,7 @@ const createMarkdownInstance = (): MarkdownIt => {
9094
breaks: true,
9195
linkify: true,
9296
typographer: true,
93-
highlight: function (str, lang) {
97+
highlight: function (str, lang, attrs) {
9498
if (lang && hljs.getLanguage(lang)) {
9599
try {
96100
return (
@@ -109,7 +113,7 @@ const createMarkdownInstance = (): MarkdownIt => {
109113
return md;
110114
};
111115

112-
const Markdown: FC<MarkdownProps> = ({ children = "", onFileClick, enableFileLinks }) => {
116+
const Markdown: FC<MarkdownProps> = ({ className, children = "", onFileClick, enableFileLinks }) => {
113117
// Cache MarkdownIt instance
114118
const md = useMemo(() => createMarkdownInstance(), []);
115119

@@ -386,7 +390,7 @@ const Markdown: FC<MarkdownProps> = ({ children = "", onFileClick, enableFileLin
386390

387391
return (
388392
<div
389-
className="markdown-content"
393+
className={cn("markdown-content", className)}
390394
onClick={handleContainerClick}
391395
dangerouslySetInnerHTML={{ __html: renderedHtml }}
392396
style={{

0 commit comments

Comments
 (0)