chore: bump version to 0.4.2-beta.1 and improve chat UX (#122)

* chore: bump version to 0.4.2-beta.1 and improve chat UX

- Bump version to 0.4.2-beta.1
- Fix live monitor session selected style to match chat session style
- Add thin scrollbar with stable gutter to live monitor sidebar
- Fix live monitor detail scroll on mobile
- Show new chat button as icon-only on mobile using JS detection

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: fix version to 0.4.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-22 08:47:44 +08:00
committed by GitHub
parent 3f88553765
commit 42a5e4052a
3 changed files with 32 additions and 4 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hermes-web-ui", "name": "hermes-web-ui",
"version": "0.4.1", "version": "0.4.2",
"description": "Web dashboard for Hermes Agent — multi-platform AI chat, session management, scheduled jobs, usage analytics & channel configuration (Telegram, Discord, Slack, WhatsApp)", "description": "Web dashboard for Hermes Agent — multi-platform AI chat, session management, scheduled jobs, usage analytics & channel configuration (Telegram, Discord, Slack, WhatsApp)",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -29,6 +29,7 @@ const showSessions = ref(
) )
const lastChatSessionsVisibility = ref(showSessions.value) const lastChatSessionsVisibility = ref(showSessions.value)
let mobileQuery: MediaQueryList | null = null let mobileQuery: MediaQueryList | null = null
const isMobile = ref(false)
function handleSessionClick(sessionId: string) { function handleSessionClick(sessionId: string) {
chatStore.switchSession(sessionId) chatStore.switchSession(sessionId)
@@ -47,6 +48,7 @@ function handleModeChange(mode: 'chat' | 'live') {
} }
function handleMobileChange(e: MediaQueryListEvent | MediaQueryList) { function handleMobileChange(e: MediaQueryListEvent | MediaQueryList) {
isMobile.value = e.matches
if (e.matches && showSessions.value) { if (e.matches && showSessions.value) {
showSessions.value = false showSessions.value = false
} }
@@ -432,11 +434,11 @@ async function handleRenameConfirm() {
</template> </template>
{{ t('chat.copySessionId') }} {{ t('chat.copySessionId') }}
</NTooltip> </NTooltip>
<NButton size="small" @click="handleNewChat"> <NButton size="small" :circle="isMobile" @click="handleNewChat">
<template #icon> <template #icon>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
</template> </template>
{{ t('chat.newChat') }} <template v-if="!isMobile">{{ t('chat.newChat') }}</template>
</NButton> </NButton>
</template> </template>
</div> </div>
@@ -191,6 +191,20 @@ onUnmounted(() => {
border-right: 1px solid $border-color; border-right: 1px solid $border-color;
overflow-y: auto; overflow-y: auto;
flex-shrink: 0; flex-shrink: 0;
scrollbar-gutter: stable;
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-thumb {
background: rgba($text-muted, 0.3);
border-radius: 4px;
}
&::-webkit-scrollbar-thumb:hover {
background: rgba($text-muted, 0.5);
}
} }
.conversation-monitor__session { .conversation-monitor__session {
@@ -204,7 +218,13 @@ onUnmounted(() => {
cursor: pointer; cursor: pointer;
&.active { &.active {
background: rgba($accent-primary, 0.08); background: rgba(var(--accent-primary-rgb), 0.12);
color: $text-primary;
font-weight: 500;
}
&.active .conversation-monitor__session-title {
color: $accent-primary;
} }
} }
@@ -294,6 +314,12 @@ onUnmounted(() => {
max-height: 220px; max-height: 220px;
border-right: 0; border-right: 0;
border-bottom: 1px solid $border-color; border-bottom: 1px solid $border-color;
flex-shrink: 0;
}
.conversation-monitor__detail {
min-height: 0;
overflow: hidden;
} }
} }
</style> </style>