diff --git a/webclient/src/components/chat/MessageList.vue b/webclient/src/components/chat/MessageList.vue index 93dc607..a797408 100644 --- a/webclient/src/components/chat/MessageList.vue +++ b/webclient/src/components/chat/MessageList.vue @@ -53,7 +53,7 @@ flashIndex.value = index setTimeout(() => { if (flashIndex.value === index) flashIndex.value = null - }, 1500) + }, 3000) } function resolveComponent(msg) { @@ -115,16 +115,19 @@ () => chat.loading, (loading) => { if (!loading) { - contentVisible.value = false - afterLayout(() => { - if (chat.scrollToMessageIndex != null) { + if (chat.scrollToMessageIndex != null) { + contentVisible.value = true + afterLayout(() => { scrollToMessage(chat.scrollToMessageIndex) chat.scrollToMessageIndex = null - } else { + }) + } else { + contentVisible.value = false + afterLayout(() => { scrollToBottom() - } - contentVisible.value = true - }) + contentVisible.value = true + }) + } } } ) diff --git a/webclient/src/components/sidebar/AppSidebar.vue b/webclient/src/components/sidebar/AppSidebar.vue index 2ad005c..ccccf02 100644 --- a/webclient/src/components/sidebar/AppSidebar.vue +++ b/webclient/src/components/sidebar/AppSidebar.vue @@ -28,31 +28,19 @@ @@ -64,13 +52,22 @@ - +
+ + +
@@ -135,7 +132,6 @@ const searchOpen = ref(false) const searchInput = ref('') -const searchInputEl = ref(null) let searchDebounceTimer = null // Keep selector in sync with the active session's profile @@ -147,12 +143,8 @@ // Toggle search UI function toggleSearch() { searchOpen.value = !searchOpen.value - if (searchOpen.value) { - // Restore previous query if any - if (sessionsStore.searchQuery) { - searchInput.value = sessionsStore.searchQuery - } - setTimeout(() => searchInputEl.value?.focus(), 50) + if (searchOpen.value && sessionsStore.searchQuery) { + searchInput.value = sessionsStore.searchQuery } } @@ -160,11 +152,9 @@ searchOpen.value = false } -function clearSearchInput() { - searchInput.value = '' +function onSearchClear() { sessionsStore.clearSearch() sessionsStore.fetchSessions(profilesStore.selectedProfileId) - searchInputEl.value?.focus() } // Debounced search @@ -201,6 +191,7 @@ profilesStore.selectedProfileId = session.profile_id } await chatStore.loadSession(session.session_id, session.match_indices?.[0]) + searchOpen.value = false emit('close') } @@ -229,21 +220,43 @@ } .sidebar-search { - padding: 0 $space-md; - border-bottom: 1px solid var(--color-border); display: none; + padding: 0 $space-md; } .sidebar-search.is-open { display: block; padding-top: $space-sm; padding-bottom: $space-sm; + border-bottom: 1px solid var(--color-border); } -.sidebar-search-bar { +.sidebar-search-inner { display: flex; align-items: center; gap: $space-xs; + + :deep(.search-field) { + flex: 1; + min-width: 0; + } +} + +.search-spinner { + display: inline-block; + width: 14px; + height: 14px; + border: 2px solid $border-color-muted; + border-top-color: $color-secondary; + border-radius: 50%; + animation: spin 0.6s linear infinite; + flex-shrink: 0; +} + +.sessions-header-actions { + display: flex; + align-items: center; + gap: 2px; } .search-toggle-btn { @@ -257,42 +270,6 @@ color: $color-text-light; } -.search-input-wrap { - flex: 1; - display: flex; - align-items: center; - gap: $space-xs; - position: relative; -} - -.search-input { - flex: 1; - min-width: 0; - background: $surface-panel-muted; - border: $border-width-base $border-style-base $border-color-muted; - border-bottom-width: $border-width-accent; - border-bottom-color: $color-text-light; - color: $color-text-light; - font-size: 13px; - padding: $space-xs $space-sm; - outline: none; - font-family: inherit; - transition: border-color $motion-base $motion-ease; -} - -.search-input:focus { - border-color: $color-secondary; -} - -.search-input::placeholder { - color: $color-text-dark; -} - -.search-clear-btn { - font-size: 12px; - color: $color-text-dark; -} - .sidebar-footer { padding: 12px 16px; border-top: 1px solid var(--color-border); diff --git a/webclient/src/styles/app.scss b/webclient/src/styles/app.scss index fa3c0ef..1d23680 100644 --- a/webclient/src/styles/app.scss +++ b/webclient/src/styles/app.scss @@ -1682,11 +1682,12 @@ // ─── Search result message flash ──────────────────────────────────────────── .msg-flash { - animation: msgFlash 1.5s ease both; + animation: msgFlash 2.5s ease-out both; } @keyframes msgFlash { - 0% { filter: brightness(1); } - 20% { filter: brightness(1.35); } - 100% { filter: brightness(1); } + 0% { filter: brightness(1); background-color: transparent; } + 15% { filter: brightness(1.4); background-color: rgba($color-secondary, 0.12); } + 40% { filter: brightness(1.4); background-color: rgba($color-secondary, 0.12); } + 100% { filter: brightness(1); background-color: transparent; } }