summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-26 09:25:10 -0600
committeradamelmore <[email protected]>2026-01-26 09:33:42 -0600
commitcd4676171b03048e6894160c5f11199392e33e53 (patch)
tree0352d2a6450777f08093c2ca52f7287477fc59a7
parent7016be073982e0612ac45b00b6f5795d5befeda6 (diff)
downloadopencode-cd4676171b03048e6894160c5f11199392e33e53.tar.gz
opencode-cd4676171b03048e6894160c5f11199392e33e53.zip
feat(app): better sidebar hover when collapsed
-rw-r--r--packages/app/src/pages/layout.tsx32
1 files changed, 25 insertions, 7 deletions
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 2b9d563f1..4230f0745 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -138,6 +138,12 @@ export default function Layout(props: ParentProps) {
const [hoverProject, setHoverProject] = createSignal<string | undefined>()
const [nav, setNav] = createSignal<HTMLElement | undefined>(undefined)
+ const navLeave = { current: undefined as number | undefined }
+
+ onCleanup(() => {
+ if (navLeave.current === undefined) return
+ clearTimeout(navLeave.current)
+ })
const sidebarHovering = createMemo(() => !layout.sidebar.opened() && hoverProject() !== undefined)
const sidebarExpanded = createMemo(() => layout.sidebar.opened() || sidebarHovering())
@@ -1702,9 +1708,10 @@ export default function Layout(props: ParentProps) {
>
<HoverCard
openDelay={1000}
- closeDelay={sidebarHovering() ? 300 : 0}
- placement="right"
- gutter={28}
+ closeDelay={sidebarHovering() ? 600 : 0}
+ placement="right-start"
+ gutter={16}
+ shift={-2}
trigger={item}
mount={!props.mobile ? nav() : undefined}
open={hoverSession() === props.session.id}
@@ -2067,7 +2074,7 @@ export default function Layout(props: ParentProps) {
size="large"
onClick={(e: MouseEvent) => {
loadMore()
- ;(e.currentTarget as HTMLButtonElement).blur()
+ ; (e.currentTarget as HTMLButtonElement).blur()
}}
>
{language.t("common.loadMore")}
@@ -2302,7 +2309,7 @@ export default function Layout(props: ParentProps) {
size="large"
onClick={(e: MouseEvent) => {
loadMore()
- ;(e.currentTarget as HTMLButtonElement).blur()
+ ; (e.currentTarget as HTMLButtonElement).blur()
}}
>
{language.t("common.loadMore")}
@@ -2663,9 +2670,20 @@ export default function Layout(props: ParentProps) {
ref={(el) => {
setNav(el)
}}
+ onMouseEnter={() => {
+ if (navLeave.current === undefined) return
+ clearTimeout(navLeave.current)
+ navLeave.current = undefined
+ }}
onMouseLeave={() => {
- setHoverSession(undefined)
- setHoverProject(undefined)
+ if (!sidebarHovering()) return
+
+ if (navLeave.current !== undefined) clearTimeout(navLeave.current)
+ navLeave.current = window.setTimeout(() => {
+ navLeave.current = undefined
+ setHoverProject(undefined)
+ setHoverSession(undefined)
+ }, 300)
}}
>
<div class="@container w-full h-full contain-strict">