@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.
Files changed (29) hide show
  1. package/dist/cjs/KaizenProvider/KaizenProvider.cjs +4 -1
  2. package/dist/cjs/reactAriaComponentsV3.cjs +11 -0
  3. package/dist/cjs/reactAriaV3.cjs +11 -0
  4. package/dist/esm/KaizenProvider/KaizenProvider.mjs +4 -1
  5. package/dist/esm/reactAriaComponentsV3.mjs +1 -0
  6. package/dist/esm/reactAriaV3.mjs +1 -0
  7. package/dist/styles.css +2 -2
  8. package/dist/types/__overlays__/Tooltip/v3/Tooltip.d.ts +10 -0
  9. package/dist/types/__react-aria-components__/index.d.ts +1 -0
  10. package/dist/types/__react-aria__/index.d.ts +1 -0
  11. package/package.json +1 -1
  12. package/src/KaizenProvider/KaizenProvider.tsx +3 -2
  13. package/src/__overlays__/Tooltip/v2/_docs/Tooltip.mdx +2 -7
  14. package/src/__overlays__/Tooltip/v3/OverlayArrow.module.scss +16 -0
  15. package/src/__overlays__/Tooltip/v3/Tooltip.module.scss +1 -1
  16. package/src/__overlays__/Tooltip/v3/Tooltip.tsx +17 -0
  17. package/src/__overlays__/Tooltip/v3/_docs/API.mdx +55 -0
  18. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +158 -0
  19. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +135 -15
  20. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.spec.stories.tsx +275 -0
  21. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stickersheet.stories.tsx +27 -49
  22. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stories.tsx +14 -248
  23. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_anatomy.png +0 -0
  24. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_variants.png +0 -0
  25. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_when_to_use.png +0 -0
  26. package/src/__react-aria-components__/index.ts +1 -0
  27. package/src/__react-aria__/index.ts +1 -0
  28. package/v3/react-aria/package.json +5 -0
  29. 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 { Button } from "~components/Button"
4
- import {
5
- StickerSheet,
6
- StickerSheetStory,
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 StickerSheetTemplate: StickerSheetStory = {
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 StickerSheetDefault: StickerSheetStory = {
46
- ...StickerSheetTemplate,
18
+ export const Standard: StickerSheetStory = {
47
19
  name: "Sticker Sheet (Default)",
48
- }
49
-
50
- export const StickerSheetReversed: StickerSheetStory = {
51
- ...StickerSheetTemplate,
52
- name: "Sticker Sheet (Reversed)",
53
- parameters: {
54
- /** @note: Only required if template has parameters, otherwise this spread can be removed */
55
- ...StickerSheetTemplate.parameters,
56
- reverseColors: true,
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
- ...StickerSheetTemplate,
40
+ ...Standard,
62
41
  name: "Sticker Sheet (RTL)",
63
42
  parameters: {
64
- /** @note: Only required if template has parameters, otherwise this spread can be removed */
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, IconButton } from "~components/Button"
6
- import { AddIcon, InformationIcon } from "~components/Icon"
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
- export const OnButton: Story = {
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 OnCustomButton: Story = {
144
- ...OnButton,
145
- name: "On Button with custom <button>",
146
- render: ({ defaultOpen, isOpen, ...args }) => (
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 OnCustomFocusableElement: Story = {
158
- render: ({ defaultOpen, isOpen, ...args }) => (
159
- <TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
160
- <Focusable>
161
- <Tag>Non-interactive element</Tag>
162
- </Focusable>
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
  }
@@ -0,0 +1 @@
1
+ export * from "react-aria-components"
@@ -0,0 +1 @@
1
+ export * from "react-aria"
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../../dist/cjs/reactAriaV3.cjs",
3
+ "module": "../../dist/esm/reactAriaV3.mjs",
4
+ "types": "../../dist/types/__react-aria__/index.d.ts"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../../dist/cjs/reactAriaComponentsV3.cjs",
3
+ "module": "../../dist/esm/reactAriaComponentsV3.mjs",
4
+ "types": "../../dist/types/__react-aria-components__/index.d.ts"
5
+ }