@kaizen/components 0.0.0-canary-versioned-tooltip-poc-20240619013415 → 0.0.0-canary-tooltip-poc-20240621045645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/KaizenProvider/KaizenProvider.cjs +4 -1
- package/dist/cjs/reactAriaComponentsV3.cjs +11 -0
- package/dist/cjs/reactAriaV3.cjs +11 -0
- package/dist/esm/KaizenProvider/KaizenProvider.mjs +4 -1
- package/dist/esm/reactAriaComponentsV3.mjs +1 -0
- package/dist/esm/reactAriaV3.mjs +1 -0
- package/dist/styles.css +2 -2
- package/dist/types/__overlays__/Tooltip/v3/Tooltip.d.ts +10 -0
- package/dist/types/__react-aria-components__/index.d.ts +1 -0
- package/dist/types/__react-aria__/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/KaizenProvider/KaizenProvider.tsx +3 -2
- package/src/__overlays__/Tooltip/v2/_docs/Tooltip.mdx +2 -7
- package/src/__overlays__/Tooltip/v3/OverlayArrow.module.scss +16 -0
- package/src/__overlays__/Tooltip/v3/Tooltip.module.scss +1 -1
- package/src/__overlays__/Tooltip/v3/Tooltip.tsx +17 -0
- package/src/__overlays__/Tooltip/v3/_docs/API.mdx +55 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +158 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +135 -15
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.spec.stories.tsx +275 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stickersheet.stories.tsx +27 -49
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stories.tsx +14 -248
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_anatomy.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_variants.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_when_to_use.png +0 -0
- package/src/__react-aria-components__/index.ts +1 -0
- package/src/__react-aria__/index.ts +1 -0
- package/v3/react-aria/package.json +5 -0
- package/v3/react-aria-components/package.json +5 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import React from "react"
|
|
2
|
+
import { Meta, StoryObj } from "@storybook/react"
|
|
3
|
+
import { expect, userEvent, waitFor, within } from "@storybook/test"
|
|
4
|
+
import isChromatic from "chromatic"
|
|
5
|
+
import { Button, IconButton } from "~components/Button"
|
|
6
|
+
import { AddIcon, InformationIcon } from "~components/Icon"
|
|
7
|
+
import { Tab, TabList, TabPanel, TabPanels, Tabs } from "~components/Tabs"
|
|
8
|
+
import { Text } from "~components/Text"
|
|
9
|
+
import { Tag } from "~components/__future__/Tag"
|
|
10
|
+
import { Focusable } from "~components/__utilities__/v3"
|
|
11
|
+
import { ToggleTip, Tooltip, TooltipTrigger } from "../index"
|
|
12
|
+
|
|
13
|
+
const meta = {
|
|
14
|
+
title: "Overlays/Tooltip/v3/Tests",
|
|
15
|
+
component: Tooltip,
|
|
16
|
+
parameters: {
|
|
17
|
+
layout: "centered",
|
|
18
|
+
},
|
|
19
|
+
args: {
|
|
20
|
+
defaultOpen: isChromatic(),
|
|
21
|
+
},
|
|
22
|
+
argTypes: {
|
|
23
|
+
// eslint-disable-next-line camelcase
|
|
24
|
+
UNSTABLE_portalContainer: {
|
|
25
|
+
control: false,
|
|
26
|
+
table: { disable: true },
|
|
27
|
+
},
|
|
28
|
+
triggerRef: { control: false },
|
|
29
|
+
},
|
|
30
|
+
} satisfies Meta<typeof Tooltip>
|
|
31
|
+
|
|
32
|
+
export default meta
|
|
33
|
+
|
|
34
|
+
type Story = StoryObj<typeof meta>
|
|
35
|
+
|
|
36
|
+
export const OnButton: Story = {
|
|
37
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
38
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
39
|
+
<Button label="Button" />
|
|
40
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
41
|
+
</TooltipTrigger>
|
|
42
|
+
),
|
|
43
|
+
play: async ({ canvasElement, step }) => {
|
|
44
|
+
const canvas = within(canvasElement.parentElement!)
|
|
45
|
+
const button = canvas.queryByRole("button") || canvas.getByRole("link")
|
|
46
|
+
|
|
47
|
+
await step("Hover shows", async () => {
|
|
48
|
+
await userEvent.unhover(button)
|
|
49
|
+
await userEvent.hover(button)
|
|
50
|
+
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
51
|
+
expect(button).toHaveAttribute(
|
|
52
|
+
"aria-describedby",
|
|
53
|
+
canvas.getByRole("tooltip").id
|
|
54
|
+
)
|
|
55
|
+
await userEvent.unhover(button)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
await step("Focus shows", async () => {
|
|
59
|
+
await userEvent.tab() // focus
|
|
60
|
+
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
61
|
+
await userEvent.tab() // unfocus
|
|
62
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
await step("Escape closes", async () => {
|
|
66
|
+
await userEvent.tab() // focus
|
|
67
|
+
await userEvent.keyboard("{Escape}")
|
|
68
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
69
|
+
await userEvent.tab() // unfocus
|
|
70
|
+
})
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export const OnLink: Story = {
|
|
75
|
+
...OnButton,
|
|
76
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
77
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
78
|
+
<Button label="Button" href="#" />
|
|
79
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
80
|
+
</TooltipTrigger>
|
|
81
|
+
),
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export const OnButtonWithDesc: Story = {
|
|
85
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
86
|
+
<>
|
|
87
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
88
|
+
<IconButton
|
|
89
|
+
label="(TESTING) Add label"
|
|
90
|
+
icon={<AddIcon role="presentation" />}
|
|
91
|
+
primary
|
|
92
|
+
aria-describedby="blah"
|
|
93
|
+
/>
|
|
94
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
95
|
+
</TooltipTrigger>
|
|
96
|
+
<Text variant="body" id="blah" classNameOverride="p-4">
|
|
97
|
+
This is target of aria-describedby
|
|
98
|
+
</Text>
|
|
99
|
+
</>
|
|
100
|
+
),
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export const OnIconButton: Story = {
|
|
104
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
105
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
106
|
+
<IconButton
|
|
107
|
+
label="Add something"
|
|
108
|
+
icon={<AddIcon role="presentation" />}
|
|
109
|
+
primary
|
|
110
|
+
// Negate the aria description (added by RAC) as it should be the
|
|
111
|
+
// same as the accessible name, therefore no need to duplicate it
|
|
112
|
+
aria-describedby={null}
|
|
113
|
+
/>
|
|
114
|
+
<Tooltip {...args}>Add something</Tooltip>
|
|
115
|
+
</TooltipTrigger>
|
|
116
|
+
),
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export const OnDisabledButton: Story = {
|
|
120
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
121
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
122
|
+
<Button label="Button" disabled />
|
|
123
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
124
|
+
</TooltipTrigger>
|
|
125
|
+
),
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export const OnCustomButtonAnchor: Story = {
|
|
129
|
+
name: "On Button with custom <a>",
|
|
130
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
131
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
132
|
+
<Button
|
|
133
|
+
label="Button"
|
|
134
|
+
component={props => (
|
|
135
|
+
// eslint-disable-next-line jsx-a11y/anchor-is-valid
|
|
136
|
+
<a {...props} href="#" style={{ padding: "0 1rem" }}>
|
|
137
|
+
Custom Link
|
|
138
|
+
</a>
|
|
139
|
+
)}
|
|
140
|
+
/>
|
|
141
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
142
|
+
</TooltipTrigger>
|
|
143
|
+
),
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export const OnCustomButton: Story = {
|
|
147
|
+
...OnButton,
|
|
148
|
+
name: "On Button with custom <button>",
|
|
149
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
150
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
151
|
+
<Button
|
|
152
|
+
label="Button"
|
|
153
|
+
component={props => <button type="button" {...props} />}
|
|
154
|
+
/>
|
|
155
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
156
|
+
</TooltipTrigger>
|
|
157
|
+
),
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export const OnCustomFocusableElement: Story = {
|
|
161
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
162
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
163
|
+
<Focusable>
|
|
164
|
+
<Tag>Non-interactive element</Tag>
|
|
165
|
+
</Focusable>
|
|
166
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
167
|
+
</TooltipTrigger>
|
|
168
|
+
),
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const OnTabs: Story = {
|
|
172
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
173
|
+
<Tabs>
|
|
174
|
+
<TabList aria-label="Tabs">
|
|
175
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
176
|
+
<Tab>Tab 1</Tab>
|
|
177
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
178
|
+
</TooltipTrigger>
|
|
179
|
+
</TabList>
|
|
180
|
+
<TabPanels>
|
|
181
|
+
<TabPanel classNameOverride="p-24 font-family-paragraph">
|
|
182
|
+
Tab content
|
|
183
|
+
</TabPanel>
|
|
184
|
+
</TabPanels>
|
|
185
|
+
</Tabs>
|
|
186
|
+
),
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export const Placement: Story = {
|
|
190
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
191
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
192
|
+
<Button label="Button" />
|
|
193
|
+
<Tooltip {...args} placement="top" shouldFlip={false}>
|
|
194
|
+
Placement top
|
|
195
|
+
</Tooltip>
|
|
196
|
+
<Tooltip {...args} placement="end" shouldFlip={false}>
|
|
197
|
+
Placement end
|
|
198
|
+
</Tooltip>
|
|
199
|
+
<Tooltip {...args} placement="bottom" shouldFlip={false}>
|
|
200
|
+
Placement bottom
|
|
201
|
+
</Tooltip>
|
|
202
|
+
<Tooltip {...args} placement="start" shouldFlip={false}>
|
|
203
|
+
Placement start
|
|
204
|
+
</Tooltip>
|
|
205
|
+
</TooltipTrigger>
|
|
206
|
+
),
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export const ReversedColors: Story = {
|
|
210
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
211
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
212
|
+
<Button label="Button" />
|
|
213
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
214
|
+
</TooltipTrigger>
|
|
215
|
+
),
|
|
216
|
+
parameters: {
|
|
217
|
+
reverseColors: true,
|
|
218
|
+
},
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export const ToggleTipStory: Story = {
|
|
222
|
+
name: "ToggleTip",
|
|
223
|
+
args: { defaultOpen: false },
|
|
224
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
225
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
226
|
+
<ToggleTip>
|
|
227
|
+
<InformationIcon role="img" aria-label="Information" />
|
|
228
|
+
</ToggleTip>
|
|
229
|
+
<Tooltip
|
|
230
|
+
{...args}
|
|
231
|
+
style={{ display: "flex", textAlign: "left", alignItems: "center" }}
|
|
232
|
+
>
|
|
233
|
+
<InformationIcon
|
|
234
|
+
role="presentation"
|
|
235
|
+
style={{ marginRight: "0.25rem" }}
|
|
236
|
+
/>
|
|
237
|
+
With rich content
|
|
238
|
+
</Tooltip>
|
|
239
|
+
</TooltipTrigger>
|
|
240
|
+
),
|
|
241
|
+
play: async ({ canvasElement, step }) => {
|
|
242
|
+
const canvas = within(canvasElement.parentElement!)
|
|
243
|
+
// focus
|
|
244
|
+
await userEvent.tab()
|
|
245
|
+
await expect(canvas.queryByRole("tooltip")).toBeNull()
|
|
246
|
+
|
|
247
|
+
await step("Enter toggles", async () => {
|
|
248
|
+
await userEvent.keyboard("{enter}")
|
|
249
|
+
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
250
|
+
await userEvent.keyboard("{enter}")
|
|
251
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
252
|
+
})
|
|
253
|
+
await step("Space toggles", async () => {
|
|
254
|
+
await userEvent.keyboard(" ")
|
|
255
|
+
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
256
|
+
await userEvent.keyboard(" ")
|
|
257
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
258
|
+
})
|
|
259
|
+
await step("Pointer toggles", async () => {
|
|
260
|
+
const button = canvasElement.getElementsByTagName("button")[0]
|
|
261
|
+
await userEvent.click(button)
|
|
262
|
+
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
263
|
+
await userEvent.click(button)
|
|
264
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
265
|
+
})
|
|
266
|
+
await step("Escape closes", async () => {
|
|
267
|
+
await userEvent.keyboard("{enter}")
|
|
268
|
+
await userEvent.keyboard("{Escape}")
|
|
269
|
+
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
// leave open for screenshot
|
|
273
|
+
await userEvent.keyboard("{enter}")
|
|
274
|
+
},
|
|
275
|
+
}
|
|
@@ -1,68 +1,46 @@
|
|
|
1
1
|
import React from "react"
|
|
2
|
-
import { Meta } from "@storybook/react"
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
} from "~storybook/components/StickerSheet"
|
|
8
|
-
import { Tooltip, TooltipTrigger } from "../index"
|
|
2
|
+
import { Meta, composeStories } from "@storybook/react"
|
|
3
|
+
import { ReversedColors } from "~components/__utilities__/v3"
|
|
4
|
+
import { StickerSheetStory } from "~storybook/components/StickerSheet"
|
|
5
|
+
import { mergeClassNames } from "~utils/mergeClassNames"
|
|
6
|
+
import * as testStories from "./Tooltip.spec.stories"
|
|
9
7
|
|
|
10
8
|
export default {
|
|
11
|
-
title: "Overlays/Tooltip/v3",
|
|
9
|
+
title: "Overlays/Tooltip/v3/Tests",
|
|
12
10
|
parameters: {
|
|
13
11
|
chromatic: { disable: false },
|
|
14
12
|
controls: { disable: true },
|
|
15
13
|
},
|
|
16
14
|
} satisfies Meta
|
|
17
15
|
|
|
18
|
-
const
|
|
19
|
-
render: () => (
|
|
20
|
-
/** @note: If you have multiple StickerSheets to display, you can add a `heading` */
|
|
21
|
-
<StickerSheet>
|
|
22
|
-
<StickerSheet.Header headings={["Default", "Hover", "Active", "Focus"]} />
|
|
23
|
-
<StickerSheet.Body>
|
|
24
|
-
<StickerSheet.Row>
|
|
25
|
-
<TooltipTrigger defaultOpen={true}>
|
|
26
|
-
<Button label="Button with tooltip" />
|
|
27
|
-
<Tooltip>Tooltip content</Tooltip>
|
|
28
|
-
</TooltipTrigger>
|
|
29
|
-
</StickerSheet.Row>
|
|
30
|
-
</StickerSheet.Body>
|
|
31
|
-
</StickerSheet>
|
|
32
|
-
),
|
|
33
|
-
/** @note: Only required if you have pseudo states, otherwise this can be removed */
|
|
34
|
-
parameters: {
|
|
35
|
-
/** @todo: Remove any inapplicable pseudo states */
|
|
36
|
-
pseudo: {
|
|
37
|
-
hover: '[data-sb-pseudo-styles="hover"]',
|
|
38
|
-
active: '[data-sb-pseudo-styles="active"]',
|
|
39
|
-
focus: '[data-sb-pseudo-styles="focus"]',
|
|
40
|
-
focusVisible: '[data-sb-pseudo-styles="focus"]',
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
}
|
|
16
|
+
const Stories = composeStories(testStories)
|
|
44
17
|
|
|
45
|
-
export const
|
|
46
|
-
...StickerSheetTemplate,
|
|
18
|
+
export const Standard: StickerSheetStory = {
|
|
47
19
|
name: "Sticker Sheet (Default)",
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
20
|
+
render: args => (
|
|
21
|
+
<div className="grid gap-x-128 gap-y-128 grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
|
22
|
+
{Object.values(Stories).map((Story, index) => (
|
|
23
|
+
<div
|
|
24
|
+
key={index}
|
|
25
|
+
className={mergeClassNames(
|
|
26
|
+
"flex items-center justify-center min-h-[10rem]",
|
|
27
|
+
Story.parameters.reverseColors ? "bg-purple-700" : ""
|
|
28
|
+
)}
|
|
29
|
+
>
|
|
30
|
+
<ReversedColors isReversed={!!Story.parameters.reverseColors}>
|
|
31
|
+
<Story {...args} defaultOpen={true} />
|
|
32
|
+
</ReversedColors>
|
|
33
|
+
</div>
|
|
34
|
+
))}
|
|
35
|
+
</div>
|
|
36
|
+
),
|
|
58
37
|
}
|
|
59
38
|
|
|
60
39
|
export const StickerSheetRTL: StickerSheetStory = {
|
|
61
|
-
...
|
|
40
|
+
...Standard,
|
|
62
41
|
name: "Sticker Sheet (RTL)",
|
|
63
42
|
parameters: {
|
|
64
|
-
|
|
65
|
-
...StickerSheetTemplate.parameters,
|
|
43
|
+
...Standard.parameters,
|
|
66
44
|
textDirection: "rtl",
|
|
67
45
|
},
|
|
68
46
|
}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import React from "react"
|
|
2
2
|
import { Meta, StoryObj } from "@storybook/react"
|
|
3
|
-
import { expect, userEvent, waitFor, within } from "@storybook/test"
|
|
4
3
|
import isChromatic from "chromatic"
|
|
5
|
-
import { Button
|
|
6
|
-
import {
|
|
7
|
-
import { Tab, TabList, TabPanel, TabPanels, Tabs } from "~components/Tabs"
|
|
8
|
-
import { Tag } from "~components/__future__/Tag"
|
|
9
|
-
import { Focusable } from "~components/__utilities__/v3"
|
|
10
|
-
import { ToggleTip, Tooltip, TooltipTrigger } from "../index"
|
|
4
|
+
import { Button } from "~components/Button"
|
|
5
|
+
import { Tooltip, TooltipTrigger } from "../index"
|
|
11
6
|
|
|
12
7
|
const meta = {
|
|
13
8
|
title: "Overlays/Tooltip/v3",
|
|
@@ -32,250 +27,21 @@ export default meta
|
|
|
32
27
|
|
|
33
28
|
type Story = StoryObj<typeof meta>
|
|
34
29
|
|
|
35
|
-
|
|
36
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
37
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
38
|
-
<Button label="Button with tooltip" />
|
|
39
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
40
|
-
</TooltipTrigger>
|
|
41
|
-
),
|
|
42
|
-
play: async ({ canvasElement, step }) => {
|
|
43
|
-
const canvas = within(canvasElement.parentElement!)
|
|
44
|
-
const button = canvas.queryByRole("button") || canvas.getByRole("link")
|
|
45
|
-
|
|
46
|
-
await step("Hover shows", async () => {
|
|
47
|
-
await userEvent.unhover(button)
|
|
48
|
-
await userEvent.hover(button)
|
|
49
|
-
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
50
|
-
expect(button).toHaveAttribute(
|
|
51
|
-
"aria-describedby",
|
|
52
|
-
canvas.getByRole("tooltip").id
|
|
53
|
-
)
|
|
54
|
-
await userEvent.unhover(button)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
await step("Focus shows", async () => {
|
|
58
|
-
await userEvent.tab() // focus
|
|
59
|
-
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
60
|
-
await userEvent.tab() // unfocus
|
|
61
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
await step("Escape closes", async () => {
|
|
65
|
-
await userEvent.tab() // focus
|
|
66
|
-
await userEvent.keyboard("{Escape}")
|
|
67
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
68
|
-
await userEvent.tab() // unfocus
|
|
69
|
-
})
|
|
70
|
-
},
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export const OnLink: Story = {
|
|
74
|
-
...OnButton,
|
|
75
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
76
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
77
|
-
<Button label="Button with tooltip" href="#" />
|
|
78
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
79
|
-
</TooltipTrigger>
|
|
80
|
-
),
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export const OnButtonWithDesc: Story = {
|
|
84
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
85
|
-
<>
|
|
86
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
87
|
-
<IconButton
|
|
88
|
-
label="(TESTING) Add label"
|
|
89
|
-
icon={<AddIcon role="presentation" />}
|
|
90
|
-
primary
|
|
91
|
-
aria-describedby="blah"
|
|
92
|
-
/>
|
|
93
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
94
|
-
</TooltipTrigger>
|
|
95
|
-
<div id="blah">Custom description</div>
|
|
96
|
-
</>
|
|
97
|
-
),
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export const OnIconButton: Story = {
|
|
101
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
102
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
103
|
-
<IconButton
|
|
104
|
-
label="Add something"
|
|
105
|
-
icon={<AddIcon role="presentation" />}
|
|
106
|
-
primary
|
|
107
|
-
// Negate the aria description (added by RAC) as it should be the
|
|
108
|
-
// same as the accessible name, therefore no need to duplicate it
|
|
109
|
-
aria-describedby={null}
|
|
110
|
-
/>
|
|
111
|
-
<Tooltip {...args}>Add something</Tooltip>
|
|
112
|
-
</TooltipTrigger>
|
|
113
|
-
),
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export const OnDisabledButton: Story = {
|
|
117
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
118
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
119
|
-
<Button label="Button with tooltip" disabled />
|
|
120
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
121
|
-
</TooltipTrigger>
|
|
122
|
-
),
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export const OnCustomButtonAnchor: Story = {
|
|
126
|
-
name: "On Button with custom <a>",
|
|
127
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
128
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
129
|
-
<Button
|
|
130
|
-
label="Button with tooltip"
|
|
131
|
-
component={props => (
|
|
132
|
-
// eslint-disable-next-line jsx-a11y/anchor-is-valid
|
|
133
|
-
<a {...props} href="#" style={{ padding: "0 1rem" }}>
|
|
134
|
-
Custom Link with tooltip
|
|
135
|
-
</a>
|
|
136
|
-
)}
|
|
137
|
-
/>
|
|
138
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
139
|
-
</TooltipTrigger>
|
|
140
|
-
),
|
|
141
|
-
}
|
|
30
|
+
import * as spec from "./Tooltip.spec.stories"
|
|
142
31
|
|
|
143
|
-
export const
|
|
144
|
-
...
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
148
|
-
<Button
|
|
149
|
-
label="Button with tooltip"
|
|
150
|
-
component={props => <button type="button" {...props} />}
|
|
151
|
-
/>
|
|
32
|
+
export const Playground: Story = {
|
|
33
|
+
render: ({ defaultOpen: _, isOpen, ...args }) => (
|
|
34
|
+
<TooltipTrigger defaultOpen={true} isOpen={isOpen}>
|
|
35
|
+
<Button label="Button" />
|
|
152
36
|
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
153
37
|
</TooltipTrigger>
|
|
154
38
|
),
|
|
155
39
|
}
|
|
156
|
-
|
|
157
|
-
export const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
164
|
-
</TooltipTrigger>
|
|
165
|
-
),
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export const OnTabs: Story = {
|
|
169
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
170
|
-
<Tabs>
|
|
171
|
-
<TabList aria-label="Tabs">
|
|
172
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
173
|
-
<Tab>Tab 1</Tab>
|
|
174
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
175
|
-
</TooltipTrigger>
|
|
176
|
-
<Tab>Tab 2</Tab>
|
|
177
|
-
<Tab badge="3">Tab 3</Tab>
|
|
178
|
-
<Tab disabled>Disabled Tab</Tab>
|
|
179
|
-
</TabList>
|
|
180
|
-
<TabPanels>
|
|
181
|
-
<TabPanel classNameOverride="p-24 font-family-paragraph">
|
|
182
|
-
Content 1
|
|
183
|
-
</TabPanel>
|
|
184
|
-
<TabPanel classNameOverride="p-24 font-family-paragraph">
|
|
185
|
-
Content 2
|
|
186
|
-
</TabPanel>
|
|
187
|
-
<TabPanel classNameOverride="p-24 font-family-paragraph">
|
|
188
|
-
Content 3
|
|
189
|
-
</TabPanel>
|
|
190
|
-
</TabPanels>
|
|
191
|
-
</Tabs>
|
|
192
|
-
),
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export const PlacementLeft: Story = {
|
|
196
|
-
...OnButton,
|
|
197
|
-
args: { placement: "left" },
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export const PlacementRight: Story = {
|
|
201
|
-
...OnButton,
|
|
202
|
-
args: { placement: "right" },
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export const PlacementTop: Story = {
|
|
206
|
-
...OnButton,
|
|
207
|
-
args: { placement: "top" },
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export const PlacementBottom: Story = {
|
|
211
|
-
...OnButton,
|
|
212
|
-
args: { placement: "bottom" },
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export const ReversedColors: Story = {
|
|
216
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
217
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
218
|
-
<Button label="Button with tooltip" reversed={true} />
|
|
219
|
-
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
220
|
-
</TooltipTrigger>
|
|
221
|
-
),
|
|
222
|
-
parameters: {
|
|
223
|
-
reverseColors: true,
|
|
224
|
-
},
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export const ToggleTipStory: Story = {
|
|
228
|
-
name: "ToggleTip",
|
|
229
|
-
args: { defaultOpen: false },
|
|
230
|
-
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
231
|
-
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
232
|
-
<ToggleTip>
|
|
233
|
-
<InformationIcon role="img" aria-label="Information" />
|
|
234
|
-
</ToggleTip>
|
|
235
|
-
<Tooltip
|
|
236
|
-
{...args}
|
|
237
|
-
style={{ display: "flex", textAlign: "left", alignItems: "center" }}
|
|
238
|
-
>
|
|
239
|
-
<InformationIcon
|
|
240
|
-
role="presentation"
|
|
241
|
-
style={{ marginRight: "0.25rem" }}
|
|
242
|
-
/>
|
|
243
|
-
With rich content
|
|
244
|
-
</Tooltip>
|
|
245
|
-
</TooltipTrigger>
|
|
246
|
-
),
|
|
247
|
-
play: async ({ canvasElement, step }) => {
|
|
248
|
-
const canvas = within(canvasElement.parentElement!)
|
|
249
|
-
// focus
|
|
250
|
-
await userEvent.tab()
|
|
251
|
-
await expect(canvas.queryByRole("tooltip")).toBeNull()
|
|
252
|
-
|
|
253
|
-
await step("Enter toggles", async () => {
|
|
254
|
-
await userEvent.keyboard("{enter}")
|
|
255
|
-
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
256
|
-
await userEvent.keyboard("{enter}")
|
|
257
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
258
|
-
})
|
|
259
|
-
await step("Space toggles", async () => {
|
|
260
|
-
await userEvent.keyboard(" ")
|
|
261
|
-
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
262
|
-
await userEvent.keyboard(" ")
|
|
263
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
264
|
-
})
|
|
265
|
-
await step("Pointer toggles", async () => {
|
|
266
|
-
const button = canvasElement.getElementsByTagName("button")[0]
|
|
267
|
-
await userEvent.click(button)
|
|
268
|
-
await waitFor(() => expect(canvas.getByRole("tooltip")).toBeVisible())
|
|
269
|
-
await userEvent.click(button)
|
|
270
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
271
|
-
})
|
|
272
|
-
await step("Escape closes", async () => {
|
|
273
|
-
await userEvent.keyboard("{enter}")
|
|
274
|
-
await userEvent.keyboard("{Escape}")
|
|
275
|
-
await waitFor(() => expect(canvas.queryByRole("tooltip")).toBeNull())
|
|
276
|
-
})
|
|
277
|
-
|
|
278
|
-
// leave open for screenshot
|
|
279
|
-
await userEvent.keyboard("{enter}")
|
|
280
|
-
},
|
|
40
|
+
export const OnButton: Story = { ...spec.OnButton, play: undefined }
|
|
41
|
+
export const OnIconButton: Story = { ...spec.OnIconButton, play: undefined }
|
|
42
|
+
export const ToggleTip: Story = { ...spec.ToggleTipStory, play: undefined }
|
|
43
|
+
export const Placement: Story = {
|
|
44
|
+
...spec.OnButton,
|
|
45
|
+
play: undefined,
|
|
46
|
+
args: { placement: "start" },
|
|
281
47
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "react-aria-components"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "react-aria"
|