diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 0c10cc89b..88572503f 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -211,13 +211,22 @@ export default function Layout(props: ParentProps) {
onMount(() => {
const stop = () => setState("sizing", false)
+ const blur = () => reset()
+ const hide = () => {
+ if (document.visibilityState !== "hidden") return
+ reset()
+ }
window.addEventListener("pointerup", stop)
window.addEventListener("pointercancel", stop)
window.addEventListener("blur", stop)
+ window.addEventListener("blur", blur)
+ document.addEventListener("visibilitychange", hide)
onCleanup(() => {
window.removeEventListener("pointerup", stop)
window.removeEventListener("pointercancel", stop)
window.removeEventListener("blur", stop)
+ window.removeEventListener("blur", blur)
+ document.removeEventListener("visibilitychange", hide)
})
})
@@ -237,6 +246,12 @@ export default function Layout(props: ParentProps) {
navLeave.current = undefined
}
+ const reset = () => {
+ disarm()
+ setState("hoverSession", undefined)
+ setHoverProject(undefined)
+ }
+
const arm = () => {
if (layout.sidebar.opened()) return
if (state.hoverProject === undefined) return
@@ -305,8 +320,7 @@ export default function Layout(props: ParentProps) {
const clearSidebarHoverState = () => {
if (layout.sidebar.opened()) return
- setState("hoverSession", undefined)
- setHoverProject(undefined)
+ reset()
}
const navigateWithSidebarReset = (href: string) => {
diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx
index f8e16f3e1..a9627c5db 100644
--- a/packages/app/src/pages/layout/sidebar-items.tsx
+++ b/packages/app/src/pages/layout/sidebar-items.tsx
@@ -157,34 +157,45 @@ const SessionHoverPreview = (props: {
messageLabel: (message: Message) => string | undefined
onMessageSelect: (message: Message) => void
trigger: JSX.Element
-}): JSX.Element => (
- props.setHoverSession(open ? props.session.id : undefined)}
- >
- {props.language.t("session.messages.loading")}}
+}): JSX.Element => {
+ let ref: HTMLDivElement | undefined
+
+ return (
+ {props.trigger}}
+ open={props.hoverSession() === props.session.id}
+ onOpenChange={(open) => {
+ if (!open) {
+ props.setHoverSession(undefined)
+ return
+ }
+ if (!ref?.matches(":hover")) return
+ props.setHoverSession(props.session.id)
+ }}
>
-
-
-
-
-
-)
+ {props.language.t("session.messages.loading")}}
+ >
+
+
+
+
+
+ )
+}
export const SessionItem = (props: SessionItemProps): JSX.Element => {
const params = useParams()