From 7736c9e9a8131407e302b871cc13075eeb946d96 Mon Sep 17 00:00:00 2001 From: chengluyu <2239547+chengluyu@users.noreply.github.com> Date: Wed, 8 Jul 2026 15:42:20 +0800 Subject: [PATCH 01/18] style(web): polish sidebar and tool typography - Use UI font and medium weight for sidebar and composer controls - Add reusable shortcut and tool output blocks - Cap long tool output at 50 lines with a scrollbar - Update sidebar show-more copy and muted styling --- apps/kimi-web/src/components/SessionRow.vue | 6 ++- apps/kimi-web/src/components/Sidebar.vue | 19 ++++++++- .../src/components/WorkspaceGroup.vue | 2 +- .../kimi-web/src/components/chat/Composer.vue | 13 +++--- .../src/components/chat/ThinkingBlock.vue | 4 +- .../src/components/chat/ThinkingPanel.vue | 2 +- apps/kimi-web/src/components/chat/ToolRow.vue | 21 +++++++--- .../components/chat/tool-calls/EditTool.vue | 16 +------ .../chat/tool-calls/GenericTool.vue | 16 +------ .../chat/tool-calls/ToolOutputBlock.vue | 42 +++++++++++++++++++ .../src/components/ui/ShortcutKey.vue | 24 +++++++++++ apps/kimi-web/src/i18n/locales/en/sidebar.ts | 4 +- apps/kimi-web/src/i18n/locales/zh/sidebar.ts | 4 +- 13 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 apps/kimi-web/src/components/chat/tool-calls/ToolOutputBlock.vue create mode 100644 apps/kimi-web/src/components/ui/ShortcutKey.vue diff --git a/apps/kimi-web/src/components/SessionRow.vue b/apps/kimi-web/src/components/SessionRow.vue index 5d1b8a6c39..e355924250 100644 --- a/apps/kimi-web/src/components/SessionRow.vue +++ b/apps/kimi-web/src/components/SessionRow.vue @@ -353,7 +353,9 @@ defineExpose({ closeMenu }); .ts { color: var(--color-text-faint); font-size: var(--text-xs); - font-family: var(--font-mono); + font-family: var(--font-ui); + font-variant-numeric: tabular-nums; + text-align: right; } /* Trailing action slot: time and kebab share one grid cell (grid-area:1/1). @@ -366,7 +368,7 @@ defineExpose({ closeMenu }); display: inline-grid; flex: none; align-items: center; - justify-items: center; + justify-items: end; } .act .ts, .act .kebab { grid-area: 1 / 1; } diff --git a/apps/kimi-web/src/components/Sidebar.vue b/apps/kimi-web/src/components/Sidebar.vue index 920eb24924..987465dbb6 100644 --- a/apps/kimi-web/src/components/Sidebar.vue +++ b/apps/kimi-web/src/components/Sidebar.vue @@ -23,6 +23,7 @@ import IconButton from './ui/IconButton.vue'; import Icon from './ui/Icon.vue'; import Menu from './ui/Menu.vue'; import MenuItem from './ui/MenuItem.vue'; +import ShortcutKey from './ui/ShortcutKey.vue'; import { useConfirmDialog } from '../composables/useConfirmDialog'; const { t } = useI18n(); @@ -599,7 +600,10 @@ onBeforeUnmount(() => { @@ -911,6 +915,7 @@ onBeforeUnmount(() => { color: var(--color-text); font-family: var(--font-ui); font-size: var(--ui-font-size); + font-weight: var(--weight-medium); cursor: pointer; text-align: left; } @@ -950,15 +955,25 @@ onBeforeUnmount(() => { flex: none; } .search-input { + display: inline-flex; + align-items: center; + gap: var(--space-1); flex: 1; min-width: 0; color: var(--color-text); - font-family: var(--mono); + font-family: var(--font-ui); font-size: var(--ui-font-size); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.search-input > span { + overflow: hidden; + text-overflow: ellipsis; +} +.search-label { + font-weight: var(--weight-medium); +} /* Sessions */ .sessions { diff --git a/apps/kimi-web/src/components/WorkspaceGroup.vue b/apps/kimi-web/src/components/WorkspaceGroup.vue index 729707b8e8..87a3a1ffb0 100644 --- a/apps/kimi-web/src/components/WorkspaceGroup.vue +++ b/apps/kimi-web/src/components/WorkspaceGroup.vue @@ -338,7 +338,7 @@ function onHeaderDragStart(event: DragEvent): void { border: none; border-radius: var(--radius-md); background: transparent; - color: var(--color-text); + color: var(--color-text-muted); font-family: var(--font-ui); font-size: var(--text-xs); text-align: left; diff --git a/apps/kimi-web/src/components/chat/Composer.vue b/apps/kimi-web/src/components/chat/Composer.vue index 4f591349a7..b15a2915da 100644 --- a/apps/kimi-web/src/components/chat/Composer.vue +++ b/apps/kimi-web/src/components/chat/Composer.vue @@ -1447,7 +1447,8 @@ function selectModel(modelId: string): void { cursor: pointer; user-select: none; transition: background 0.1s, color 0.15s; - font-family: var(--sans); + font-family: var(--font-ui); + font-weight: var(--weight-medium); } .perm-pill:hover { background: var(--color-surface-sunken); @@ -1548,6 +1549,7 @@ function selectModel(modelId: string): void { display: flex; flex-direction: column; gap: 1px; + font-family: var(--font-ui); } .md-section { @@ -1567,7 +1569,7 @@ function selectModel(modelId: string): void { background: none; border: none; cursor: pointer; - font-family: var(--mono); + font-family: var(--font-ui); font-size: var(--ui-font-size); color: var(--color-text); padding: 5px 7px; @@ -1634,7 +1636,7 @@ function selectModel(modelId: string): void { border-radius: var(--radius-sm); } .md-thinking .md-name { - font-family: var(--mono); + font-family: var(--font-ui); font-size: var(--ui-font-size); color: var(--color-text); flex: none; @@ -1657,7 +1659,7 @@ function selectModel(modelId: string): void { border: none; background: none; cursor: pointer; - font-family: var(--mono); + font-family: var(--font-ui); font-size: var(--ui-font-size-xs); line-height: 1; color: var(--color-text-muted); @@ -1770,7 +1772,8 @@ function selectModel(modelId: string): void { background: none; border-radius: 6px; font-size: var(--ui-font-size); - font-family: var(--sans); + font-family: var(--font-ui); + font-weight: var(--weight-medium); color: var(--color-text); cursor: pointer; user-select: none; diff --git a/apps/kimi-web/src/components/chat/ThinkingBlock.vue b/apps/kimi-web/src/components/chat/ThinkingBlock.vue index 64156d7cf3..afa450897f 100644 --- a/apps/kimi-web/src/components/chat/ThinkingBlock.vue +++ b/apps/kimi-web/src/components/chat/ThinkingBlock.vue @@ -118,14 +118,14 @@ watch( .prev { color: var(--color-text-faint); - font: var(--text-base)/var(--leading-relaxed) var(--font-mono); + font: var(--text-base)/var(--leading-relaxed) var(--font-ui); white-space: pre-wrap; word-break: break-word; display: block; } .tc { - font: var(--text-base)/var(--leading-relaxed) var(--font-mono); + font: var(--text-base)/var(--leading-relaxed) var(--font-ui); color: var(--color-text-muted); white-space: pre-wrap; word-break: break-word; diff --git a/apps/kimi-web/src/components/chat/ThinkingPanel.vue b/apps/kimi-web/src/components/chat/ThinkingPanel.vue index d2b3772b41..1309a40288 100644 --- a/apps/kimi-web/src/components/chat/ThinkingPanel.vue +++ b/apps/kimi-web/src/components/chat/ThinkingPanel.vue @@ -64,7 +64,7 @@ watch( overflow-y: auto; margin: 0; padding: 12px 14px; - font: var(--text-base)/var(--leading-relaxed) var(--font-mono); + font: var(--text-base)/var(--leading-relaxed) var(--font-ui); color: var(--color-text-muted); white-space: pre-wrap; word-break: break-word; diff --git a/apps/kimi-web/src/components/chat/ToolRow.vue b/apps/kimi-web/src/components/chat/ToolRow.vue index 63d49c4c4d..65d8a3bd5a 100644 --- a/apps/kimi-web/src/components/chat/ToolRow.vue +++ b/apps/kimi-web/src/components/chat/ToolRow.vue @@ -55,10 +55,12 @@ function onHeadClick(): void { >