Skip to content

Commit c8b0ea0

Browse files
committed
Fixes
1 parent f8490ba commit c8b0ea0

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
@@ -12,8 +12,9 @@ export function SpacesDropdown(props: {
1212
siteSpace: SiteSpace;
1313
siteSpaces: SiteSpace[];
1414
className?: string;
15+
withPortal?: boolean;
1516
}) {
16-
const { context, siteSpace, siteSpaces, className } = props;
17+
const { context, siteSpace, siteSpaces, className, withPortal } = props;
1718
const { linker } = context;
1819

1920
return (
@@ -22,6 +23,7 @@ export function SpacesDropdown(props: {
2223
'group-hover/dropdown:invisible', // Prevent hover from opening the dropdown, as it's annoying in this context
2324
'group-focus-within/dropdown:group-hover/dropdown:visible' // When the dropdown is already open, it should remain visible when hovered
2425
)}
26+
withPortal={withPortal}
2527
button={
2628
<div
2729
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;

packages/gitbook/src/components/utils/Sheet.tsx

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,23 +49,38 @@ export function SheetContent({
4949
side?: 'right' | 'left';
5050
}) {
5151
return (
52-
<>
52+
<SheetPortal>
5353
<SheetOverlay className={overlayClassName} />
5454
<SheetPrimitive.Content
5555
data-slot="sheet-content"
5656
className={tcls(
57-
'fixed z-30 flex flex-col rounded-xl shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',
57+
'fixed',
58+
'z-30',
59+
'flex',
60+
'flex-col',
61+
'shadow-lg',
62+
'depth-flat:shadow-none',
63+
64+
'transition ease-in-out',
65+
'data-[state=closed]:duration-300 data-[state=open]:duration-500',
66+
67+
'border',
5868
'border-tint-subtle',
59-
'inset-x-1.5 inset-y-1.5 w-10/12 border sm:max-w-sm',
69+
70+
'inset-x-1.5',
71+
'inset-y-1.5',
72+
73+
'w-10/12',
74+
'sm:max-w-sm',
75+
6076
'bg-tint-base',
61-
'theme-gradient:bg-gradient-primary',
62-
'sidebar-filled:bg-tint-subtle',
63-
'theme-muted:bg-tint-subtle',
6477
'sidebar-filled:bg-tint-subtle',
6578
'theme-muted:bg-tint-subtle',
6679
'[html.sidebar-filled.theme-bold.tint_&]:bg-tint-subtle',
6780
'[html.sidebar-filled.theme-muted_&]:bg-tint-base',
6881
'[html.sidebar-filled.theme-bold.tint_&]:bg-tint-base',
82+
83+
'rounded-xl',
6984
'circular-corners:rounded-2xl',
7085
'straight-corners:rounded-none',
7186
side === 'right' &&
@@ -80,18 +95,17 @@ export function SheetContent({
8095

8196
<SheetClose asChild>
8297
<Button
83-
data-slot="sheet-close"
84-
variant="blank"
98+
variant="secondary"
8599
icon="close"
86100
iconOnly
87-
size="default"
88-
className="absolute top-3 right-2 z-50"
101+
autoFocus={false}
102+
className="absolute top-2 right-2 z-50 bg-transparent text-tint opacity-8 shadow-none ring-transparent"
89103
>
90104
<span className="sr-only">Close</span>
91105
</Button>
92106
</SheetClose>
93107
</SheetPrimitive.Content>
94-
</>
108+
</SheetPortal>
95109
);
96110
}
97111

0 commit comments

Comments
 (0)