Skip to content

Commit c84733a

Browse files
committed
switch between popover and tooltip components based on device type
1 parent 15d75f5 commit c84733a

File tree

5 files changed

+79
-23
lines changed

5 files changed

+79
-23
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"@radix-ui/react-radio-group": "^1.2.0",
4747
"@radix-ui/react-slot": "^1.1.0",
4848
"@radix-ui/react-switch": "^1.1.0",
49+
"@radix-ui/react-tooltip": "^1.1.2",
4950
"@radix-ui/react-visually-hidden": "^1.1.0",
5051
"@sentry/nextjs": "^8.19.0",
5152
"@socialgouv/matomo-next": "^1.8.0",

src/components/Tooltip/index.tsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import React, { ComponentProps, ReactNode, useEffect } from "react"
22

3+
import { isMobile } from "@/lib/utils/isMobile"
4+
35
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"
6+
import {
7+
Tooltip as Tooltipcomponent,
8+
TooltipContent,
9+
TooltipTrigger,
10+
} from "../ui/tooltip"
411

512
import { useDisclosure } from "@/hooks/useDisclosure"
613

@@ -57,24 +64,25 @@ const Tooltip = ({
5764
}
5865
}
5966

67+
// Use Popover on mobile devices since the user can't hover
68+
const Component = isMobile() ? Popover : Tooltipcomponent
69+
const Trigger = isMobile() ? PopoverTrigger : TooltipTrigger
70+
const Content = isMobile() ? PopoverContent : TooltipContent
71+
6072
return (
61-
<Popover open={isOpen} onOpenChange={handleOpenChange} {...props}>
62-
<PopoverTrigger
63-
onMouseEnter={onOpen}
64-
onMouseLeave={onClose}
65-
className="focus-visible:rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-hover"
66-
>
73+
<Component open={isOpen} onOpenChange={handleOpenChange} {...props}>
74+
<Trigger className="focus-visible:rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-hover">
6775
{children}
68-
</PopoverTrigger>
69-
<PopoverContent
76+
</Trigger>
77+
<Content
7078
side="top"
7179
sideOffset={2}
7280
className="w-80 px-5 text-sm"
7381
data-testid="tooltip-popover"
7482
>
7583
{content}
76-
</PopoverContent>
77-
</Popover>
84+
</Content>
85+
</Component>
7886
)
7987
}
8088

src/components/ui/tooltip.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import * as React from "react"
2+
import * as TooltipPrimitive from "@radix-ui/react-tooltip"
3+
4+
import { cn } from "@/lib/utils/cn"
5+
6+
const TooltipProvider = TooltipPrimitive.Provider
7+
8+
const Tooltip = TooltipPrimitive.Root
9+
10+
const TooltipTrigger = TooltipPrimitive.Trigger
11+
12+
const TooltipContent = React.forwardRef<
13+
React.ElementRef<typeof TooltipPrimitive.Content>,
14+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
15+
>(({ children, className, sideOffset = 4, ...props }, ref) => (
16+
<TooltipPrimitive.Content
17+
ref={ref}
18+
sideOffset={sideOffset}
19+
className={cn(
20+
"z-popover overflow-hidden rounded-md bg-background-highlight p-4 text-sm text-body shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
21+
className
22+
)}
23+
{...props}
24+
>
25+
{children}
26+
<TooltipPrimitive.Arrow className="z-popover fill-background-highlight" />
27+
</TooltipPrimitive.Content>
28+
))
29+
TooltipContent.displayName = TooltipPrimitive.Content.displayName
30+
31+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }

src/pages/_app.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useEffect } from "react"
22
import { appWithTranslation } from "next-i18next"
3+
import { TooltipProvider } from "@radix-ui/react-tooltip"
34
import { init } from "@socialgouv/matomo-next"
45

56
import { AppPropsWithLayout } from "@/lib/types"
@@ -26,13 +27,15 @@ const App = ({ Component, pageProps }: AppPropsWithLayout) => {
2627

2728
return (
2829
<ThemeProvider>
29-
<BaseLayout
30-
contentIsOutdated={!!pageProps.frontmatter?.isOutdated}
31-
contentNotTranslated={pageProps.contentNotTranslated}
32-
lastDeployLocaleTimestamp={pageProps.lastDeployLocaleTimestamp}
33-
>
34-
{getLayout(<Component {...pageProps} />)}
35-
</BaseLayout>
30+
<TooltipProvider>
31+
<BaseLayout
32+
contentIsOutdated={!!pageProps.frontmatter?.isOutdated}
33+
contentNotTranslated={pageProps.contentNotTranslated}
34+
lastDeployLocaleTimestamp={pageProps.lastDeployLocaleTimestamp}
35+
>
36+
{getLayout(<Component {...pageProps} />)}
37+
</BaseLayout>
38+
</TooltipProvider>
3639
</ThemeProvider>
3740
)
3841
}

yarn.lock

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4501,6 +4501,24 @@
45014501
"@radix-ui/react-use-previous" "1.1.0"
45024502
"@radix-ui/react-use-size" "1.1.0"
45034503

4504+
"@radix-ui/react-tooltip@^1.1.2":
4505+
version "1.1.2"
4506+
resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz#c42db2ffd7dcc6ff3d65407c8cb70490288f518d"
4507+
integrity sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==
4508+
dependencies:
4509+
"@radix-ui/primitive" "1.1.0"
4510+
"@radix-ui/react-compose-refs" "1.1.0"
4511+
"@radix-ui/react-context" "1.1.0"
4512+
"@radix-ui/react-dismissable-layer" "1.1.0"
4513+
"@radix-ui/react-id" "1.1.0"
4514+
"@radix-ui/react-popper" "1.2.0"
4515+
"@radix-ui/react-portal" "1.1.1"
4516+
"@radix-ui/react-presence" "1.1.0"
4517+
"@radix-ui/react-primitive" "2.0.0"
4518+
"@radix-ui/react-slot" "1.1.0"
4519+
"@radix-ui/react-use-controllable-state" "1.1.0"
4520+
"@radix-ui/react-visually-hidden" "1.1.0"
4521+
45044522
"@radix-ui/react-use-callback-ref@1.0.1":
45054523
version "1.0.1"
45064524
resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a"
@@ -13084,7 +13102,7 @@ prelude-ls@^1.2.1:
1308413102
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
1308513103
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1308613104

13087-
"prettier-fallback@npm:prettier@^3":
13105+
"prettier-fallback@npm:prettier@^3", prettier@^3.1.1:
1308813106
version "3.3.2"
1308913107
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
1309013108
integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
@@ -13099,11 +13117,6 @@ prettier@^2.0.5, prettier@^2.8.8:
1309913117
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
1310013118
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
1310113119

13102-
prettier@^3.1.1:
13103-
version "3.3.2"
13104-
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
13105-
integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
13106-
1310713120
prettier@^3.3.3:
1310813121
version "3.3.3"
1310913122
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"

0 commit comments

Comments
 (0)