Skip to content

Commit 7016be0

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

2 files changed

Lines changed: 13 additions & 11 deletions

File tree

packages/app/src/pages/layout.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ 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 }
140+
const [nav, setNav] = createSignal<HTMLElement | undefined>(undefined)
141141

142142
const sidebarHovering = createMemo(() => !layout.sidebar.opened() && hoverProject() !== undefined)
143143
const sidebarExpanded = createMemo(() => layout.sidebar.opened() || sidebarHovering())
@@ -1702,10 +1702,11 @@ export default function Layout(props: ParentProps) {
17021702
>
17031703
<HoverCard
17041704
openDelay={1000}
1705-
closeDelay={0}
1705+
closeDelay={sidebarHovering() ? 300 : 0}
17061706
placement="right"
17071707
gutter={28}
17081708
trigger={item}
1709+
mount={!props.mobile ? nav() : undefined}
17091710
open={hoverSession() === props.session.id}
17101711
onOpenChange={(open) => setHoverSession(open ? props.session.id : undefined)}
17111712
>
@@ -1743,7 +1744,7 @@ export default function Layout(props: ParentProps) {
17431744
"group-focus-within/session:opacity-100 group-focus-within/session:pointer-events-auto": true,
17441745
}}
17451746
>
1746-
<DropdownMenu open={menuOpen()} onOpenChange={setMenuOpen}>
1747+
<DropdownMenu modal={!sidebarHovering()} open={menuOpen()} onOpenChange={setMenuOpen}>
17471748
<Tooltip value={language.t("common.moreOptions")} placement="top">
17481749
<DropdownMenu.Trigger
17491750
as={IconButton}
@@ -1753,7 +1754,7 @@ export default function Layout(props: ParentProps) {
17531754
aria-label={language.t("common.moreOptions")}
17541755
/>
17551756
</Tooltip>
1756-
<DropdownMenu.Portal mount={!props.mobile ? navRef.current : undefined}>
1757+
<DropdownMenu.Portal mount={!props.mobile ? nav() : undefined}>
17571758
<DropdownMenu.Content
17581759
onCloseAutoFocus={(event) => {
17591760
if (!pendingRename()) return
@@ -1993,7 +1994,7 @@ export default function Layout(props: ParentProps) {
19931994
"group-focus-within/workspace:opacity-100 group-focus-within/workspace:pointer-events-auto": true,
19941995
}}
19951996
>
1996-
<DropdownMenu open={menuOpen()} onOpenChange={setMenuOpen}>
1997+
<DropdownMenu modal={!sidebarHovering()} open={menuOpen()} onOpenChange={setMenuOpen}>
19971998
<Tooltip value={language.t("common.moreOptions")} placement="top">
19981999
<DropdownMenu.Trigger
19992000
as={IconButton}
@@ -2003,7 +2004,7 @@ export default function Layout(props: ParentProps) {
20032004
aria-label={language.t("common.moreOptions")}
20042005
/>
20052006
</Tooltip>
2006-
<DropdownMenu.Portal mount={!props.mobile ? navRef.current : undefined}>
2007+
<DropdownMenu.Portal mount={!props.mobile ? nav() : undefined}>
20072008
<DropdownMenu.Content
20082009
onCloseAutoFocus={(event) => {
20092010
if (!pendingRename()) return
@@ -2411,15 +2412,15 @@ export default function Layout(props: ParentProps) {
24112412
</Tooltip>
24122413
</div>
24132414

2414-
<DropdownMenu>
2415+
<DropdownMenu modal={!sidebarHovering()}>
24152416
<DropdownMenu.Trigger
24162417
as={IconButton}
24172418
icon="dot-grid"
24182419
variant="ghost"
24192420
class="shrink-0 size-6 rounded-md opacity-0 group-hover/project:opacity-100 data-[expanded]:opacity-100 data-[expanded]:bg-surface-base-active"
24202421
aria-label={language.t("common.moreOptions")}
24212422
/>
2422-
<DropdownMenu.Portal mount={!panelProps.mobile ? navRef.current : undefined}>
2423+
<DropdownMenu.Portal mount={!panelProps.mobile ? nav() : undefined}>
24232424
<DropdownMenu.Content class="mt-1">
24242425
<DropdownMenu.Item onSelect={() => dialog.show(() => <DialogEditProject project={p} />)}>
24252426
<DropdownMenu.ItemLabel>{language.t("common.edit")}</DropdownMenu.ItemLabel>
@@ -2660,7 +2661,7 @@ export default function Layout(props: ParentProps) {
26602661
}}
26612662
style={{ width: layout.sidebar.opened() ? `${Math.max(layout.sidebar.width(), 244)}px` : "64px" }}
26622663
ref={(el) => {
2663-
navRef.current = el
2664+
setNav(el)
26642665
}}
26652666
onMouseLeave={() => {
26662667
setHoverSession(undefined)

packages/ui/src/components/hover-card.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@ import { ComponentProps, JSXElement, ParentProps, splitProps } from "solid-js"
33

44
export interface HoverCardProps extends ParentProps, Omit<ComponentProps<typeof Kobalte>, "children"> {
55
trigger: JSXElement
6+
mount?: HTMLElement
67
class?: ComponentProps<"div">["class"]
78
classList?: ComponentProps<"div">["classList"]
89
}
910

1011
export function HoverCard(props: HoverCardProps) {
11-
const [local, rest] = splitProps(props, ["trigger", "class", "classList", "children"])
12+
const [local, rest] = splitProps(props, ["trigger", "mount", "class", "classList", "children"])
1213

1314
return (
1415
<Kobalte gutter={4} {...rest}>
1516
<Kobalte.Trigger as="div" data-slot="hover-card-trigger">
1617
{local.trigger}
1718
</Kobalte.Trigger>
18-
<Kobalte.Portal>
19+
<Kobalte.Portal mount={local.mount}>
1920
<Kobalte.Content
2021
data-component="hover-card-content"
2122
classList={{

0 commit comments

Comments
 (0)