Skip to content

Commit ff35db0

Browse files
committed
wip(app): full-height sidebar
1 parent af3d8c3 commit ff35db0

1 file changed

Lines changed: 41 additions & 4 deletions

File tree

packages/app/src/pages/layout.tsx

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ export default function Layout(props: ParentProps) {
137137
const [hoverSession, setHoverSession] = createSignal<string | undefined>()
138138
const [hoverProject, setHoverProject] = createSignal<string | undefined>()
139139

140+
const navRef = { current: undefined as HTMLElement | undefined }
141+
140142
const sidebarHovering = createMemo(() => !layout.sidebar.opened() && hoverProject() !== undefined)
141143
const sidebarExpanded = createMemo(() => layout.sidebar.opened() || sidebarHovering())
142144

@@ -151,6 +153,19 @@ export default function Layout(props: ParentProps) {
151153
setHoverProject(undefined)
152154
})
153155

156+
createEffect(
157+
on(
158+
() => ({ dir: params.dir, id: params.id }),
159+
() => {
160+
if (layout.sidebar.opened()) return
161+
if (!hoverProject()) return
162+
setHoverSession(undefined)
163+
setHoverProject(undefined)
164+
},
165+
{ defer: true },
166+
),
167+
)
168+
154169
const autoselecting = createMemo(() => {
155170
if (params.dir) return false
156171
if (initialDir) return false
@@ -1044,6 +1059,10 @@ export default function Layout(props: ParentProps) {
10441059

10451060
function navigateToProject(directory: string | undefined) {
10461061
if (!directory) return
1062+
if (!layout.sidebar.opened()) {
1063+
setHoverSession(undefined)
1064+
setHoverProject(undefined)
1065+
}
10471066
server.projects.touch(directory)
10481067
const lastSession = store.lastSession[directory]
10491068
navigate(`/${base64Encode(directory)}${lastSession ? `/session/${lastSession}` : ""}`)
@@ -1052,6 +1071,10 @@ export default function Layout(props: ParentProps) {
10521071

10531072
function navigateToSession(session: Session | undefined) {
10541073
if (!session) return
1074+
if (!layout.sidebar.opened()) {
1075+
setHoverSession(undefined)
1076+
setHoverProject(undefined)
1077+
}
10551078
navigate(`/${base64Encode(session.directory)}/session/${session.id}`)
10561079
layout.mobileSidebar.hide()
10571080
}
@@ -1730,7 +1753,7 @@ export default function Layout(props: ParentProps) {
17301753
aria-label={language.t("common.moreOptions")}
17311754
/>
17321755
</Tooltip>
1733-
<DropdownMenu.Portal>
1756+
<DropdownMenu.Portal mount={!props.mobile ? navRef.current : undefined}>
17341757
<DropdownMenu.Content
17351758
onCloseAutoFocus={(event) => {
17361759
if (!pendingRename()) return
@@ -1980,7 +2003,7 @@ export default function Layout(props: ParentProps) {
19802003
aria-label={language.t("common.moreOptions")}
19812004
/>
19822005
</Tooltip>
1983-
<DropdownMenu.Portal>
2006+
<DropdownMenu.Portal mount={!props.mobile ? navRef.current : undefined}>
19842007
<DropdownMenu.Content
19852008
onCloseAutoFocus={(event) => {
19862009
if (!pendingRename()) return
@@ -2291,6 +2314,10 @@ export default function Layout(props: ParentProps) {
22912314
}
22922315

22932316
const createWorkspace = async (project: LocalProject) => {
2317+
if (!layout.sidebar.opened()) {
2318+
setHoverSession(undefined)
2319+
setHoverProject(undefined)
2320+
}
22942321
const created = await globalSDK.client.worktree
22952322
.create({ directory: project.worktree })
22962323
.then((x) => x.data)
@@ -2392,7 +2419,7 @@ export default function Layout(props: ParentProps) {
23922419
class="shrink-0 size-6 rounded-md opacity-0 group-hover/project:opacity-100 data-[expanded]:opacity-100 data-[expanded]:bg-surface-base-active"
23932420
aria-label={language.t("common.moreOptions")}
23942421
/>
2395-
<DropdownMenu.Portal>
2422+
<DropdownMenu.Portal mount={!panelProps.mobile ? navRef.current : undefined}>
23962423
<DropdownMenu.Content class="mt-1">
23972424
<DropdownMenu.Item onSelect={() => dialog.show(() => <DialogEditProject project={p} />)}>
23982425
<DropdownMenu.ItemLabel>{language.t("common.edit")}</DropdownMenu.ItemLabel>
@@ -2440,6 +2467,10 @@ export default function Layout(props: ParentProps) {
24402467
icon="plus-small"
24412468
class="w-full"
24422469
onClick={() => {
2470+
if (!layout.sidebar.opened()) {
2471+
setHoverSession(undefined)
2472+
setHoverProject(undefined)
2473+
}
24432474
navigate(`/${base64Encode(p.worktree)}/session`)
24442475
layout.mobileSidebar.hide()
24452476
}}
@@ -2628,7 +2659,13 @@ export default function Layout(props: ParentProps) {
26282659
"relative shrink-0": true,
26292660
}}
26302661
style={{ width: layout.sidebar.opened() ? `${Math.max(layout.sidebar.width(), 244)}px` : "64px" }}
2631-
onMouseLeave={() => setHoverProject(undefined)}
2662+
ref={(el) => {
2663+
navRef.current = el
2664+
}}
2665+
onMouseLeave={() => {
2666+
setHoverSession(undefined)
2667+
setHoverProject(undefined)
2668+
}}
26322669
>
26332670
<div class="@container w-full h-full contain-strict">
26342671
<SidebarContent />

0 commit comments

Comments
 (0)