Skip to content

Commit 2d5fc43

Browse files
committed
Fixes
1 parent f523575 commit 2d5fc43

File tree

11 files changed

+77
-52
lines changed

11 files changed

+77
-52
lines changed

packages/gitbook/src/components/Header/DropdownMenu.tsx

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useState } from 'react';
77
import { type ClassValue, tcls } from '@/lib/tailwind';
88

99
import * as RadixDropdownMenu from '@radix-ui/react-dropdown-menu';
10+
import { Slot } from '@radix-ui/react-slot';
1011

1112
import { Link, type LinkInsightsProps } from '../primitives';
1213

@@ -25,13 +26,21 @@ export function DropdownMenu(props: {
2526
children: React.ReactNode;
2627
/** Custom styles */
2728
className?: ClassValue;
28-
/** Open the dropdown on hover */
29+
/** Open the dropdown on hover
30+
* @default false
31+
*/
2932
openOnHover?: boolean;
33+
/** Whether to render the dropdown menu in a portal
34+
* @default true
35+
*/
36+
withPortal?: boolean;
3037
}) {
31-
const { button, children, className, openOnHover = false } = props;
38+
const { button, children, className, openOnHover = false, withPortal = true } = props;
3239
const [hovered, setHovered] = useState(false);
3340
const [clicked, setClicked] = useState(false);
3441

42+
const Portal = withPortal ? RadixDropdownMenu.Portal : Slot;
43+
3544
return (
3645
<RadixDropdownMenu.Root
3746
modal={false}
@@ -48,24 +57,27 @@ export function DropdownMenu(props: {
4857
{button}
4958
</RadixDropdownMenu.Trigger>
5059

51-
<RadixDropdownMenu.Content
52-
data-testid="dropdown-menu"
53-
hideWhenDetached
54-
collisionPadding={8}
55-
onMouseEnter={() => setHovered(true)}
56-
onMouseLeave={() => setHovered(false)}
57-
align="start"
58-
className="z-[9999] animate-present pt-2"
59-
>
60-
<div
61-
className={tcls(
62-
'flex max-h-80 min-w-40 max-w-[40vw] flex-col gap-1 overflow-auto rounded-lg straight-corners:rounded-sm bg-tint-base p-2 shadow-lg ring-1 ring-tint-subtle sm:min-w-52 sm:max-w-80',
63-
className
64-
)}
60+
<Portal>
61+
<RadixDropdownMenu.Content
62+
data-testid="dropdown-menu"
63+
hideWhenDetached
64+
collisionPadding={8}
65+
onMouseEnter={() => setHovered(true)}
66+
onMouseLeave={() => setHovered(false)}
67+
align="start"
68+
sideOffset={8}
69+
className="z-40 animate-present"
6570
>
66-
{children}
67-
</div>
68-
</RadixDropdownMenu.Content>
71+
<div
72+
className={tcls(
73+
'flex max-h-80 min-w-40 max-w-[40vw] flex-col gap-1 overflow-auto rounded-lg straight-corners:rounded-sm bg-tint-base p-2 shadow-lg ring-1 ring-tint-subtle sm:min-w-52 sm:max-w-80',
74+
className
75+
)}
76+
>
77+
{children}
78+
</div>
79+
</RadixDropdownMenu.Content>
80+
</Portal>
6981
</RadixDropdownMenu.Root>
7082
);
7183
}

packages/gitbook/src/components/Header/Header.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ export function Header(props: { context: GitBookSiteContext; withTopHeader?: boo
7777
)}
7878
>
7979
<HeaderMobileMenuButton
80-
pages={context.pages}
8180
className={tcls(
8281
'lg:hidden',
8382
'-ml-2',

packages/gitbook/src/components/Header/HeaderMobileMenuButton.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,14 @@ import { useEffect } from 'react';
66
import { useMobileMenuSheet } from '@/components/Header/mobile-menu/useMobileMenuSheet';
77
import { tString, useLanguage } from '@/intl/client';
88
import { tcls } from '@/lib/tailwind';
9-
import type { GitBookSiteContext } from '@v2/lib/context';
109
import { usePathname } from 'next/navigation';
1110

1211
/**
1312
* Button to show/hide the table of content on mobile.
1413
*/
15-
export function HeaderMobileMenuButton({
16-
pages,
17-
...props
18-
}: Partial<React.ButtonHTMLAttributes<HTMLButtonElement>> & {
19-
pages: GitBookSiteContext['pages'];
20-
}) {
14+
export function HeaderMobileMenuButton(
15+
props: Partial<React.ButtonHTMLAttributes<HTMLButtonElement>>
16+
) {
2117
const language = useLanguage();
2218
const pathname = usePathname();
2319
const { open, setOpen } = useMobileMenuSheet();
@@ -26,7 +22,7 @@ export function HeaderMobileMenuButton({
2622
setOpen(!open);
2723
};
2824

29-
// Close the navigation when navigating to a page
25+
// biome-ignore lint/correctness/useExhaustiveDependencies: Close the navigation when navigating to a page
3026
useEffect(() => {
3127
if (!open) return;
3228
setOpen(false);

packages/gitbook/src/components/Header/SpacesDropdown.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ export function SpacesDropdown(props: {
1111
siteSpace: SiteSpace;
1212
siteSpaces: SiteSpace[];
1313
className?: string;
14+
withPortal?: boolean;
1415
}) {
15-
const { context, siteSpace, siteSpaces, className } = props;
16+
const { context, siteSpace, siteSpaces, className, withPortal } = props;
1617

1718
return (
1819
<DropdownMenu
1920
className={tcls(
2021
'group-hover/dropdown:invisible', // Prevent hover from opening the dropdown, as it's annoying in this context
2122
'group-focus-within/dropdown:group-hover/dropdown:visible' // When the dropdown is already open, it should remain visible when hovered
2223
)}
24+
withPortal={withPortal}
2325
button={
2426
<div
2527
data-testid="space-dropdown-button"

packages/gitbook/src/components/Header/mobile-menu/MobileMenuSheet.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ import {
99
} from '@/components/utils/Sheet';
1010
import { useMobileMenuSheet } from './useMobileMenuSheet';
1111

12-
export function MobileMenuSheet({ children }: { children: React.ReactNode }) {
12+
export function MobileMenuSheet(props: { children: React.ReactNode }) {
13+
const { children } = props;
1314
const { open, setOpen } = useMobileMenuSheet();
1415

1516
return (
1617
<Sheet open={open} onOpenChange={setOpen}>
1718
<SheetContent
1819
aria-label="Mobile menu"
1920
overlayClassName="lg:hidden"
20-
className="lg:hidden"
21+
className="pb-2 lg:hidden"
2122
>
2223
{/** Needed for screen readers */}
2324
<SheetHeader className="sr-only">

packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,15 @@ export function SpaceLayout(props: {
7373
innerHeader={
7474
isMultiVariants ? (
7575
<SpacesDropdown
76+
withPortal={false}
7677
context={context}
7778
siteSpace={siteSpace}
7879
siteSpaces={siteSpaces}
7980
className={tcls(
8081
'w-full',
8182
'page-no-toc:hidden',
82-
'site-header-none:page-no-toc:flex'
83+
'site-header-none:page-no-toc:flex',
84+
'h-8'
8385
)}
8486
/>
8587
) : null

packages/gitbook/src/components/TableOfContents/PageGroupItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ export function PageGroupItem(props: {
2929
'[html.sidebar-filled.theme-bold.tint_&]:bg-tint-subtle',
3030
'[html.sidebar-filled.theme-muted_&]:bg-tint-base',
3131
'[html.sidebar-filled.theme-bold.tint_&]:bg-tint-base',
32-
'[html.sidebar-default.theme-gradient_&]:bg-gradient-primary',
33-
'[html.sidebar-default.theme-gradient.tint_&]:bg-gradient-tint'
32+
'lg:[html.sidebar-default.theme-gradient_&]:bg-gradient-primary',
33+
'lg:[html.sidebar-default.theme-gradient.tint_&]:bg-gradient-tint'
3434
)}
3535
>
3636
<TOCPageIcon page={page} />

packages/gitbook/src/components/TableOfContents/TOCScrollContent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ export function TOCScrollContent(props: {
3232
)}
3333
>
3434
{!!innerHeader && (
35-
<div className="inline-flex w-full flex-col gap-2 px-3 *:mt-0.5 max-lg:mt-3 max-lg:pr-12 lg:px-2 lg:pr-4">
35+
<div className="inline-flex w-full flex-col gap-2 px-2 max-lg:mt-2 max-lg:pr-12 lg:pr-4 lg:*:mt-0.5">
3636
{innerHeader}
3737
</div>
3838
)}
3939

4040
<TOCScrollContainer // The scrollview inside the sidebar
4141
className={tcls(
42-
'flex flex-grow flex-col p-3 lg:p-2',
42+
'flex flex-grow flex-col p-2',
4343
innerHeader ? 'mt-0' : 'mt-8',
4444
customization.trademark.enabled && 'pb-20',
4545
'gutter-stable overflow-y-auto',

packages/gitbook/src/components/TableOfContents/Trademark.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,13 @@ export function Trademark(props: {
2424
'z-[2]',
2525
'absolute',
2626

27-
'lg:left-0',
28-
'lg:bottom-0',
2927
'left-2',
3028
'right-2',
31-
'bottom-2',
29+
'bottom-0',
30+
'lg:left-0',
3231

3332
'pt-2',
34-
'lg:py-0',
33+
'lg:pt-0',
3534

3635
'pointer-events-none',
3736
'sidebar-filled:pl-2',

packages/gitbook/src/components/primitives/Button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function Button({
6464
const sizes = {
6565
default: ['text-base', 'py-2', 'circular-corners:px-6', iconOnly ? '!px-2' : 'px-5'],
6666
medium: ['text-sm', 'py-1.5', 'circular-corners:px-4', iconOnly ? '!px-1.5' : 'px-3.5'],
67-
small: ['text-xs', 'py-2', iconOnly ? 'px-2' : 'px-3'],
67+
small: ['text-xs', 'py-2', iconOnly ? '!px-2' : 'px-3'],
6868
};
6969

7070
const sizeClasses = sizes[size] || sizes.default;

0 commit comments

Comments
 (0)