@kaizen/components 1.51.0 → 1.52.1
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/Button/GenericButton/GenericButton.cjs +89 -82
- package/dist/cjs/Button/GenericButton/GenericButton.module.scss.cjs +2 -1
- package/dist/cjs/ButtonGroup/ButtonGroup.cjs +4 -4
- package/dist/cjs/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs +2 -2
- package/dist/cjs/GuidanceBlock/GuidanceBlock.cjs +2 -2
- package/dist/cjs/KaizenProvider/KaizenProvider.cjs +1 -1
- package/dist/cjs/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.cjs +11 -2
- package/dist/cjs/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.cjs +1 -2
- package/dist/cjs/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.cjs +2 -2
- package/dist/cjs/Table/Table.cjs +2 -2
- package/dist/cjs/Tabs/subcomponents/Tab.cjs +20 -14
- package/dist/cjs/__future__/Workflow/subcomponents/Header/Header.cjs +1 -1
- package/dist/cjs/__overlays__/Focusable/v3/Focusable.cjs +33 -0
- package/dist/cjs/__overlays__/Focusable/v3/Focusable.module.scss.cjs +6 -0
- package/dist/cjs/__overlays__/Tooltip/v1/Tooltip.module.scss.cjs +21 -0
- package/dist/cjs/__overlays__/Tooltip/v1/index.cjs +8 -0
- package/dist/cjs/__overlays__/Tooltip/v3/OverlayArrow.cjs +32 -0
- package/dist/cjs/__overlays__/Tooltip/v3/OverlayArrow.module.scss.cjs +7 -0
- package/dist/cjs/__overlays__/Tooltip/v3/Tooltip.cjs +59 -0
- package/dist/cjs/__overlays__/Tooltip/v3/Tooltip.module.scss.cjs +8 -0
- package/dist/cjs/__overlays__/Tooltip/v3/TooltipTrigger.cjs +24 -0
- package/dist/cjs/__utilities__/ReversedColors/v3/ReversedColors.cjs +23 -0
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/overlaysV1.cjs +4 -0
- package/dist/cjs/overlaysV2.cjs +4 -0
- package/dist/cjs/overlaysV3.cjs +15 -0
- package/dist/cjs/reactAriaComponentsV3.cjs +11 -0
- package/dist/cjs/reactAriaV3.cjs +11 -0
- package/dist/cjs/utilitiesV3.cjs +5 -0
- package/dist/cjs/utils/mergeClassNames.cjs +33 -0
- package/dist/esm/Button/GenericButton/GenericButton.mjs +90 -82
- package/dist/esm/Button/GenericButton/GenericButton.module.scss.mjs +2 -1
- package/dist/esm/ButtonGroup/ButtonGroup.mjs +1 -1
- package/dist/esm/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs +1 -1
- package/dist/esm/GuidanceBlock/GuidanceBlock.mjs +1 -1
- package/dist/esm/KaizenProvider/KaizenProvider.mjs +1 -1
- package/dist/esm/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.mjs +11 -2
- package/dist/esm/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.mjs +1 -2
- package/dist/esm/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.mjs +1 -1
- package/dist/esm/Table/Table.mjs +1 -1
- package/dist/esm/Tabs/subcomponents/Tab.mjs +21 -15
- package/dist/esm/__future__/Workflow/subcomponents/Header/Header.mjs +1 -1
- package/dist/esm/__overlays__/Focusable/v3/Focusable.mjs +24 -0
- package/dist/esm/__overlays__/Focusable/v3/Focusable.module.scss.mjs +4 -0
- package/dist/esm/__overlays__/Tooltip/v1/Tooltip.module.scss.mjs +19 -0
- package/dist/esm/__overlays__/Tooltip/v1/index.mjs +6 -0
- package/dist/esm/__overlays__/Tooltip/v3/OverlayArrow.mjs +24 -0
- package/dist/esm/__overlays__/Tooltip/v3/OverlayArrow.module.scss.mjs +5 -0
- package/dist/esm/__overlays__/Tooltip/v3/Tooltip.mjs +46 -0
- package/dist/esm/__overlays__/Tooltip/v3/Tooltip.module.scss.mjs +6 -0
- package/dist/esm/__overlays__/Tooltip/v3/TooltipTrigger.mjs +16 -0
- package/dist/esm/__utilities__/ReversedColors/v3/ReversedColors.mjs +14 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/overlaysV1.mjs +1 -0
- package/dist/esm/overlaysV2.mjs +1 -0
- package/dist/esm/overlaysV3.mjs +4 -0
- package/dist/esm/reactAriaComponentsV3.mjs +1 -0
- package/dist/esm/reactAriaV3.mjs +1 -0
- package/dist/esm/utilitiesV3.mjs +1 -0
- package/dist/esm/utils/mergeClassNames.mjs +25 -0
- package/dist/styles.css +18 -15
- package/dist/types/Button/GenericButton/GenericButton.d.ts +2 -1
- package/dist/types/ButtonGroup/ButtonGroup.d.ts +1 -1
- package/dist/types/Container/Container.d.ts +1 -1
- package/dist/types/Content/Content.d.ts +1 -1
- package/dist/types/DateInput/DateInput/DateInput.d.ts +1 -1
- package/dist/types/DatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
- package/dist/types/Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.d.ts +1 -1
- package/dist/types/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
- package/dist/types/GuidanceBlock/GuidanceBlock.d.ts +1 -1
- package/dist/types/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.d.ts +2 -2
- package/dist/types/Notification/subcomponents/GenericNotification/GenericNotification.d.ts +1 -1
- package/dist/types/Select/Select.d.ts +3 -3
- package/dist/types/__future__/Select/Select.d.ts +2 -2
- package/dist/types/__future__/Select/subcomponents/SelectToggle/SelectToggle.d.ts +2 -2
- package/dist/types/__overlays__/Focusable/v3/Focusable.d.ts +6 -0
- package/dist/types/__overlays__/Focusable/v3/index.d.ts +1 -0
- package/dist/types/__overlays__/Tooltip/v1/index.d.ts +8 -0
- package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.d.ts +2 -2
- package/dist/types/__overlays__/Tooltip/v2/index.d.ts +1 -0
- package/dist/types/__overlays__/Tooltip/v3/OverlayArrow.d.ts +7 -0
- package/dist/types/__overlays__/Tooltip/v3/Tooltip.d.ts +32 -0
- package/dist/types/__overlays__/Tooltip/v3/TooltipTrigger.d.ts +19 -0
- package/dist/types/__overlays__/Tooltip/v3/index.d.ts +2 -0
- package/dist/types/__overlays__/v1.d.ts +1 -0
- package/dist/types/__overlays__/v2.d.ts +1 -0
- package/dist/types/__overlays__/v3.d.ts +2 -0
- package/dist/types/__react-aria-components__/index.d.ts +1 -0
- package/dist/types/__react-aria__/index.d.ts +1 -0
- package/dist/types/__utilities__/ReversedColors/v3/ReversedColors.d.ts +7 -0
- package/dist/types/__utilities__/ReversedColors/v3/index.d.ts +1 -0
- package/dist/types/__utilities__/v3.d.ts +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/utils/getNodeText.d.ts +1 -2
- package/dist/types/utils/mergeClassNames.d.ts +8 -0
- package/package.json +6 -1
- package/src/Button/Button/Button.module.scss +33 -23
- package/src/Button/GenericButton/GenericButton.tsx +135 -91
- package/src/Button/utils/_mixins.scss +1 -1
- package/src/ButtonGroup/ButtonGroup.tsx +1 -1
- package/src/ButtonGroup/_docs/ButtonGroup.stickersheet.stories.tsx +1 -1
- package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.tsx +1 -1
- package/src/GuidanceBlock/GuidanceBlock.tsx +1 -1
- package/src/KaizenProvider/KaizenProvider.tsx +5 -7
- package/src/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.tsx +14 -4
- package/src/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.tsx +1 -1
- package/src/Notification/subcomponents/GenericNotification/GenericNotification.tsx +1 -1
- package/src/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.tsx +1 -1
- package/src/Table/Table.tsx +1 -1
- package/src/Tabs/_docs/Tabs.stories.tsx +1 -1
- package/src/Tabs/subcomponents/Tab.tsx +27 -21
- package/src/__future__/Workflow/subcomponents/Header/Header.tsx +1 -1
- package/src/__overlays__/Focusable/v3/Focusable.module.scss +3 -0
- package/src/__overlays__/Focusable/v3/Focusable.tsx +37 -0
- package/src/__overlays__/Focusable/v3/_docs/ApiSpecification.mdx +38 -0
- package/src/__overlays__/Focusable/v3/_docs/Focusable.stories.tsx +24 -0
- package/src/__overlays__/Focusable/v3/index.ts +1 -0
- package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.module.scss +1 -1
- package/src/__overlays__/Tooltip/v1/_docs/Tooltip.mdx +139 -0
- package/src/{Tooltip → __overlays__/Tooltip/v1}/_docs/Tooltip.stickersheet.stories.tsx +1 -1
- package/src/{Tooltip → __overlays__/Tooltip/v1}/_docs/Tooltip.stories.tsx +2 -2
- package/src/__overlays__/Tooltip/v1/index.ts +7 -0
- package/src/{Tooltip → __overlays__/Tooltip/v2}/_docs/Tooltip.mdx +2 -4
- package/src/__overlays__/Tooltip/v2/_docs/Tooltip.stories.tsx +49 -0
- package/src/__overlays__/Tooltip/v2/index.ts +1 -0
- package/src/__overlays__/Tooltip/v3/OverlayArrow.module.scss +43 -0
- package/src/__overlays__/Tooltip/v3/OverlayArrow.tsx +34 -0
- package/src/__overlays__/Tooltip/v3/Tooltip.module.scss +67 -0
- package/src/__overlays__/Tooltip/v3/Tooltip.tsx +101 -0
- package/src/__overlays__/Tooltip/v3/TooltipTrigger.tsx +30 -0
- package/src/__overlays__/Tooltip/v3/_docs/ApiSpecification.mdx +163 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +203 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +182 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.spec.stories.tsx +219 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stickersheet.stories.tsx +46 -0
- package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stories.tsx +72 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_anatomy.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_placement.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_1.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_2.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_3.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_variant.png +0 -0
- package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_when_to_use.png +0 -0
- package/src/__overlays__/Tooltip/v3/index.ts +2 -0
- package/src/__overlays__/v1.ts +1 -0
- package/src/__overlays__/v2.ts +2 -0
- package/src/__overlays__/v3.ts +2 -0
- package/src/__react-aria-components__/index.ts +1 -0
- package/src/__react-aria__/index.ts +1 -0
- package/src/__utilities__/ReversedColors/v3/ReversedColors.tsx +20 -0
- package/src/__utilities__/ReversedColors/v3/index.ts +1 -0
- package/src/__utilities__/v3.ts +1 -0
- package/src/index.ts +1 -1
- package/src/types/cssVariables.d.ts +7 -0
- package/src/utils/mergeClassNames.ts +32 -0
- package/v1/overlays/package.json +5 -0
- package/v2/overlays/package.json +5 -0
- package/v3/overlays/package.json +5 -0
- package/v3/react-aria/package.json +5 -0
- package/v3/react-aria-components/package.json +5 -0
- package/dist/cjs/Tooltip/Tooltip.module.scss.cjs +0 -21
- package/dist/esm/Tooltip/Tooltip.module.scss.mjs +0 -19
- package/dist/types/AvatarGroup/_docs/example-data.d.ts +0 -8
- package/dist/types/BrandMoment/_docs/ExampleHeaders.d.ts +0 -3
- package/dist/types/Calendar/_docs/controls/defaultMonthControls.d.ts +0 -2
- package/dist/types/Calendar/_docs/controls/weekStartsOnControls.d.ts +0 -2
- package/dist/types/DatePicker/_docs/controls/datePickerLocaleControls.d.ts +0 -2
- package/dist/types/DatePicker/_docs/controls/disabledDayMatchersControls.d.ts +0 -2
- package/dist/types/Filter/FilterBar/context/types.d.ts +0 -28
- package/dist/types/Filter/FilterDatePicker/_docs/controls/disabledDaysControls.d.ts +0 -2
- package/dist/types/Filter/FilterDatePicker/_docs/controls/validationControls.d.ts +0 -2
- package/dist/types/Filter/FilterDateRangePicker/_docs/controls/disabledDaysControls.d.ts +0 -2
- package/dist/types/Filter/FilterDateRangePicker/_docs/controls/validationControls.d.ts +0 -2
- package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +0 -10
- package/dist/types/Filter/FilterSelect/_docs/mockData.d.ts +0 -6
- package/dist/types/Filter/_docs/controls/renderTriggerControls.d.ts +0 -2
- package/dist/types/Menu/_docs/MenuContentExample.d.ts +0 -8
- package/dist/types/Menu/_docs/examples.d.ts +0 -11
- package/dist/types/Modal/_docs/controls.d.ts +0 -11
- package/dist/types/MultiSelect/MultiSelect.d.ts +0 -23
- package/dist/types/MultiSelect/subcomponents/MultiSelectOptions/MultiSelectOptions.d.ts +0 -13
- package/dist/types/Tooltip/index.d.ts +0 -1
- package/dist/types/Workflow/_docs/controls/controls.d.ts +0 -2
- package/dist/types/Workflow/_docs/controls/index.d.ts +0 -1
- package/dist/types/__future__/Select/_docs/mockData.d.ts +0 -6
- package/dist/types/__future__/Select/types.d.ts +0 -22
- package/dist/types/__future__/Workflow/_docs/controls/controls.d.ts +0 -2
- package/dist/types/__future__/Workflow/_docs/controls/index.d.ts +0 -1
- package/src/Tooltip/index.ts +0 -1
- /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.cjs +0 -0
- /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.cjs +0 -0
- /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.cjs +0 -0
- /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.mjs +0 -0
- /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.mjs +0 -0
- /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.mjs +0 -0
- /package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.d.ts +0 -0
- /package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.d.ts +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.spec.tsx +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.tsx +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/_variables.scss +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.spec.tsx +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.tsx +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.spec.tsx +0 -0
- /package/src/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.tsx +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Canvas, Meta, Controls } from "@storybook/blocks"
|
|
2
|
+
import { CheckIcon, ClearIcon } from "~components/Icon"
|
|
3
|
+
import { ResourceLinks, SbContent, Installation } from "~storybook/components"
|
|
4
|
+
import * as TooltipStories from "./Tooltip.docs.stories"
|
|
5
|
+
import AnatomyPng from "./assets/tooltip_anatomy.png"
|
|
6
|
+
import PlacementPng from "./assets/tooltip_placement.png"
|
|
7
|
+
import Trigger1Png from "./assets/tooltip_trigger_1.png"
|
|
8
|
+
import Trigger2Png from "./assets/tooltip_trigger_2.png"
|
|
9
|
+
import Trigger3Png from "./assets/tooltip_trigger_3.png"
|
|
10
|
+
import WhenToUsePng from "./assets/tooltip_variant.png"
|
|
11
|
+
|
|
12
|
+
<Meta title="Overlays/Tooltip/v3/Usage Guidelines" />
|
|
13
|
+
|
|
14
|
+
<SbContent>
|
|
15
|
+
# Tooltip (v3)
|
|
16
|
+
|
|
17
|
+
Updated June 25, 2024
|
|
18
|
+
</SbContent>
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<ResourceLinks
|
|
22
|
+
sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/Tooltip"
|
|
23
|
+
figma="https://www.figma.com/file/eZKEE5kXbEMY3lx84oz8iN/%F0%9F%92%9C-UI-Kit%3A-Heart?type=design&node-id=1929%3A32006&mode=design&t=LwTCBZ5E1uRvOA1l-1"
|
|
24
|
+
designGuidelines="/?path=/docs/overlays-tooltip-v3-usage-guidelines--docs"
|
|
25
|
+
ariaComponentPage="https://react-spectrum.adobe.com/react-aria/Tooltip.html"
|
|
26
|
+
apiSpecification="/?path=/docs/overlays-tooltip-v3-api-specifications--docs"
|
|
27
|
+
className="!mb-8"
|
|
28
|
+
/>
|
|
29
|
+
|
|
30
|
+
<SbContent>
|
|
31
|
+
<Installation
|
|
32
|
+
installCommand="pnpm add @kaizen/components"
|
|
33
|
+
importStatement='import { Tooltip, TooltipTrigger } from "@kaizen/components/v3/overlays"'
|
|
34
|
+
/>
|
|
35
|
+
|
|
36
|
+
## Overview
|
|
37
|
+
|
|
38
|
+
Tooltips are brief floating labels used to add additional contextual information when users hover, click or focus on an interactive element. These should offer concise explanations, elaborating on the element they are associated with.
|
|
39
|
+
</SbContent>
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
<Canvas
|
|
43
|
+
of={TooltipStories.Playground}
|
|
44
|
+
source={{code: `
|
|
45
|
+
<TooltipTrigger>
|
|
46
|
+
<Button label="Button" />
|
|
47
|
+
<Tooltip>Tooltip content</Tooltip>
|
|
48
|
+
</TooltipTrigger>
|
|
49
|
+
`}}
|
|
50
|
+
/>
|
|
51
|
+
<Controls of={TooltipStories.Playground} include={["placement", "isOpen"]} className="mb-64" />
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
<SbContent className="mb-64">
|
|
55
|
+
### Anatomy
|
|
56
|
+
|
|
57
|
+
- The anatomy of a tooltip is made up of a container, description and arrow.
|
|
58
|
+
- **They do not include a title or heading**. If you need to include a title, use a Popover
|
|
59
|
+
- A tooltip is connected to a trigger element, such as a button or icon, that shows the tooltip when the interactive trigger element is hovered or focused. (More details below.)
|
|
60
|
+
|
|
61
|
+
<img src={AnatomyPng} alt="Indicates the anatomy of the Tooltip component, the Container, Label, Arrow and Trigger" className="mt-24" />
|
|
62
|
+
</ SbContent>
|
|
63
|
+
|
|
64
|
+
<SbContent className="mb-64">
|
|
65
|
+
### When to use
|
|
66
|
+
|
|
67
|
+
- Tooltips are used to provide additional information when space is tight.
|
|
68
|
+
- Tooltips must be concise with one or more lines of text.
|
|
69
|
+
- Tooltips must be accessible via hover and focus only.
|
|
70
|
+
- Trigger tooltips from Interactive elements (Buttons, Links, Icon buttons) or Non-interactive elements (Icons, Abbreviations Truncated text)—be mindful of keyboard accessibility
|
|
71
|
+
- **Never include any kind of error messages** in a tooltip
|
|
72
|
+
|
|
73
|
+
<img src={WhenToUsePng} alt="Illustration of when to use the Tooltip component" className="mt-24"/>
|
|
74
|
+
</ SbContent>
|
|
75
|
+
|
|
76
|
+
<SbContent >
|
|
77
|
+
### Dos and don'ts
|
|
78
|
+
</SbContent >
|
|
79
|
+
|
|
80
|
+
<div className="flex flex-col mt-16 gap-40 mb-64">
|
|
81
|
+
<div className="flex flex-col m-0 gap-16">
|
|
82
|
+
<SbContent variant="heading-4">
|
|
83
|
+
#### Do use tooltips to describe icons
|
|
84
|
+
Icons are not always easy to identify on their own. When you use components that don't have labels — for example, icon-only action buttons and tabs — make sure to use tooltips to provide context for the icons.
|
|
85
|
+
</SbContent>
|
|
86
|
+
<div className="grid grid-cols-2 gap-16">
|
|
87
|
+
<div className="relative [&>*]:m-0">
|
|
88
|
+
<div className="bg-green-500 absolute top-6 left-6 z-10 py-4 px-6 font-bold text-white rounded flex gap-2 items-center justify-center">
|
|
89
|
+
<CheckIcon role="presentation" />
|
|
90
|
+
<SbContent ><span className="text-white"><strong>Do</strong></span></SbContent>
|
|
91
|
+
</div>
|
|
92
|
+
<Canvas of={TooltipStories.Primary} className="border-green-500 !rounded" />
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div className="flex flex-col gap-16">
|
|
98
|
+
<SbContent variant="heading-4">
|
|
99
|
+
#### Don't use tooltips to communicate crucial information
|
|
100
|
+
|
|
101
|
+
Tooltips should never stop a user (or be a gate) from completing a task or performing an action. They disappear so they should never contain critical information that a user would absolutely need to proceed, or information without which a user may cause errors. If the information is crucial for a user to proceed, consider using a modal or inline notification instead.
|
|
102
|
+
</SbContent>
|
|
103
|
+
<div className="grid grid-cols-2 gap-16">
|
|
104
|
+
<div className="relative [&>*]:m-0">
|
|
105
|
+
<div className="bg-green-500 absolute top-6 left-6 z-10 py-4 px-6 font-bold text-white rounded flex gap-2 items-center justify-center">
|
|
106
|
+
<CheckIcon role="presentation" />
|
|
107
|
+
<SbContent ><span className="text-white"><strong>Do</strong></span></SbContent>
|
|
108
|
+
</div>
|
|
109
|
+
<Canvas of={TooltipStories.DoFieldTooltip} className="border-green-500 !rounded-[10px]" />
|
|
110
|
+
</div>
|
|
111
|
+
<div className="relative [&>*]:m-0">
|
|
112
|
+
<div className="bg-gray-500 absolute top-6 left-6 z-10 py-4 px-6 font-bold text-white rounded flex gap-2 items-center justify-center">
|
|
113
|
+
<ClearIcon role="presentation" />
|
|
114
|
+
<SbContent ><span className="text-white"><strong>Don't</strong></span></SbContent>
|
|
115
|
+
</div>
|
|
116
|
+
<Canvas of={TooltipStories.DontFieldTooltip} className="border-gray-500 !rounded-[10px]" />
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<div className="flex flex-col m-0 gap-16">
|
|
122
|
+
<SbContent variant="heading-4">
|
|
123
|
+
#### Do be concise
|
|
124
|
+
|
|
125
|
+
Good tooltips contain concise and helpful information, keep it short. If you need more space, consider using a Popover. Don’t use it to duplicate information that already exists on the page. Instead, closely consider its placement and whether the disclosed copy will inform the action the user is about to perform.
|
|
126
|
+
</SbContent>
|
|
127
|
+
<div className="grid grid-cols-2 gap-16">
|
|
128
|
+
<div className="relative [&>*]:m-0">
|
|
129
|
+
<div className="bg-green-500 absolute top-6 left-6 z-10 py-4 px-6 font-bold text-white rounded flex gap-2 items-center justify-center">
|
|
130
|
+
<CheckIcon role="presentation" />
|
|
131
|
+
<SbContent ><span className="text-white"><strong>Do</strong></span></SbContent>
|
|
132
|
+
</div>
|
|
133
|
+
<Canvas of={TooltipStories.DoConcise} className="border-green-500 !rounded-[10px]" />
|
|
134
|
+
</div>
|
|
135
|
+
<div className="relative [&>*]:m-0">
|
|
136
|
+
<div className="bg-gray-500 absolute top-6 left-6 z-10 py-4 px-6 font-bold text-white rounded flex gap-2 items-center justify-center">
|
|
137
|
+
<ClearIcon role="presentation" />
|
|
138
|
+
<SbContent ><span className="text-white"><strong>Don't</strong></span></SbContent>
|
|
139
|
+
</div>
|
|
140
|
+
<Canvas of={TooltipStories.DontConcise} className="border-gray-500 !rounded-[10px]" />
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<SbContent className="mb-64">
|
|
147
|
+
### Placements
|
|
148
|
+
|
|
149
|
+
<img src={PlacementPng} alt="" className="mb-24" />
|
|
150
|
+
|
|
151
|
+
- Type: Dropdown to choose from Default (dark tooltip) and Reverse (light tooltip)
|
|
152
|
+
- Direction: Dropdown to choose where the arrow points
|
|
153
|
+
- Tooltip label: Input field allows you to type in the label from the properties panel
|
|
154
|
+
- Use strong signifiers for trigger elements to ensure the tooltip is discoverable.
|
|
155
|
+
- The proximity of tooltips is always paired to the element with which they are associated.
|
|
156
|
+
</SbContent>
|
|
157
|
+
|
|
158
|
+
<SbContent className="mb-64">
|
|
159
|
+
### Trigger
|
|
160
|
+
|
|
161
|
+
- Should be shown on hover, click or on focus events
|
|
162
|
+
- Needs to be discoverable:
|
|
163
|
+
- E.g. something like an icon to suggest there’s a tooltip.
|
|
164
|
+
- Avoid triggering tooltips from text that excludes a visual indicator (e.g. underline)
|
|
165
|
+
|
|
166
|
+
<img src={Trigger1Png} alt="" className="my-24" />
|
|
167
|
+
|
|
168
|
+
- Only trigger tooltips from interactive elements, such as:
|
|
169
|
+
- Buttons
|
|
170
|
+
- Links
|
|
171
|
+
- Icon buttons
|
|
172
|
+
|
|
173
|
+
<img src={Trigger2Png} alt="" className="my-24" />
|
|
174
|
+
|
|
175
|
+
- Non-interactive elements (be mindful of keyboard accessibility):
|
|
176
|
+
- Icons
|
|
177
|
+
- Abbreviations (e.g. dashed underlined text for HRIS that shows a tooltip that says Human Resource Information System)
|
|
178
|
+
- Truncated text
|
|
179
|
+
- For interactive elements that trigger tooltips, only have optional information in the tooltip because it could be missed when the user clicks
|
|
180
|
+
|
|
181
|
+
<img src={Trigger3Png} alt="" className="my-24" />
|
|
182
|
+
</SbContent>
|
|
@@ -0,0 +1,219 @@
|
|
|
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 } 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/__overlays__/v3"
|
|
11
|
+
import { 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
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from "react"
|
|
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"
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
title: "Overlays/Tooltip/v3/Tests",
|
|
10
|
+
parameters: {
|
|
11
|
+
chromatic: { disable: false },
|
|
12
|
+
controls: { disable: true },
|
|
13
|
+
},
|
|
14
|
+
} satisfies Meta
|
|
15
|
+
|
|
16
|
+
const Stories = composeStories(testStories)
|
|
17
|
+
|
|
18
|
+
export const Standard: StickerSheetStory = {
|
|
19
|
+
name: "Sticker Sheet (Default)",
|
|
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
|
+
),
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const StickerSheetRTL: StickerSheetStory = {
|
|
40
|
+
...Standard,
|
|
41
|
+
name: "Sticker Sheet (RTL)",
|
|
42
|
+
parameters: {
|
|
43
|
+
...Standard.parameters,
|
|
44
|
+
textDirection: "rtl",
|
|
45
|
+
},
|
|
46
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React, { FunctionComponent } from "react"
|
|
2
|
+
import { Meta, StoryObj } from "@storybook/react"
|
|
3
|
+
import isChromatic from "chromatic"
|
|
4
|
+
import { Button } from "~components/Button"
|
|
5
|
+
import { Tag } from "~components/__future__"
|
|
6
|
+
import { Focusable } from "~components/__overlays__/v3"
|
|
7
|
+
import { Tooltip, TooltipTrigger } from "../index"
|
|
8
|
+
import * as testStories from "./Tooltip.spec.stories"
|
|
9
|
+
|
|
10
|
+
const meta = {
|
|
11
|
+
title: "Overlays/Tooltip/v3",
|
|
12
|
+
component: Tooltip,
|
|
13
|
+
parameters: {
|
|
14
|
+
layout: "centered",
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
defaultOpen: isChromatic(),
|
|
18
|
+
},
|
|
19
|
+
subcomponents: { TooltipTrigger } as Record<string, FunctionComponent<any>>,
|
|
20
|
+
argTypes: {
|
|
21
|
+
// eslint-disable-next-line camelcase
|
|
22
|
+
UNSTABLE_portalContainer: {
|
|
23
|
+
control: false,
|
|
24
|
+
table: { disable: true },
|
|
25
|
+
},
|
|
26
|
+
triggerRef: { control: false },
|
|
27
|
+
},
|
|
28
|
+
} satisfies Meta<typeof Tooltip>
|
|
29
|
+
|
|
30
|
+
export default meta
|
|
31
|
+
|
|
32
|
+
type Story = StoryObj<typeof meta>
|
|
33
|
+
|
|
34
|
+
export const Playground: Story = {
|
|
35
|
+
render: ({ defaultOpen: _, isOpen, ...args }) => (
|
|
36
|
+
<TooltipTrigger defaultOpen={true} isOpen={isOpen}>
|
|
37
|
+
<Button label="Button" />
|
|
38
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
39
|
+
</TooltipTrigger>
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const OnButton: Story = { ...testStories.OnButton, play: undefined }
|
|
44
|
+
export const OnLink: Story = { ...testStories.OnLink, play: undefined }
|
|
45
|
+
export const OnIconButton: Story = {
|
|
46
|
+
...testStories.OnIconButton,
|
|
47
|
+
play: undefined,
|
|
48
|
+
}
|
|
49
|
+
export const Placement: Story = {
|
|
50
|
+
...testStories.OnButton,
|
|
51
|
+
play: undefined,
|
|
52
|
+
args: { placement: "end" },
|
|
53
|
+
}
|
|
54
|
+
export const OnTabs: Story = {
|
|
55
|
+
...testStories.OnTabs,
|
|
56
|
+
play: undefined,
|
|
57
|
+
}
|
|
58
|
+
export const OnCustomFocusableElement: Story = {
|
|
59
|
+
render: ({ defaultOpen, isOpen, ...args }) => (
|
|
60
|
+
<TooltipTrigger defaultOpen={defaultOpen} isOpen={isOpen}>
|
|
61
|
+
<Focusable>
|
|
62
|
+
<Tag>Non-interactive element</Tag>
|
|
63
|
+
</Focusable>
|
|
64
|
+
<Tooltip {...args}>Tooltip content</Tooltip>
|
|
65
|
+
</TooltipTrigger>
|
|
66
|
+
),
|
|
67
|
+
play: undefined,
|
|
68
|
+
}
|
|
69
|
+
export const OnReversed: Story = {
|
|
70
|
+
...testStories.ReversedColors,
|
|
71
|
+
play: undefined,
|
|
72
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Tooltip/v1"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "react-aria-components"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "react-aria"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React, { ReactNode } from "react"
|
|
2
|
+
|
|
3
|
+
export type ReversedColorsProps = {
|
|
4
|
+
children: ReactNode
|
|
5
|
+
isReversed?: boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const ReversedColorsContext = React.createContext<boolean>(false)
|
|
9
|
+
|
|
10
|
+
export const useReversedColors = (): boolean =>
|
|
11
|
+
React.useContext(ReversedColorsContext)
|
|
12
|
+
|
|
13
|
+
export const ReversedColors = ({
|
|
14
|
+
children,
|
|
15
|
+
isReversed = true,
|
|
16
|
+
}: ReversedColorsProps): JSX.Element => (
|
|
17
|
+
<ReversedColorsContext.Provider value={isReversed}>
|
|
18
|
+
{children}
|
|
19
|
+
</ReversedColorsContext.Provider>
|
|
20
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ReversedColors"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ReversedColors/v3"
|
package/src/index.ts
CHANGED
|
@@ -56,8 +56,8 @@ export * from "./Tile"
|
|
|
56
56
|
export * from "./TimeField"
|
|
57
57
|
export * from "./TitleBlockZen"
|
|
58
58
|
export * from "./ToggleSwitch"
|
|
59
|
-
export * from "./Tooltip"
|
|
60
59
|
export * from "./utils"
|
|
61
60
|
export * from "./VisuallyHidden"
|
|
62
61
|
export * from "./Well"
|
|
63
62
|
export * from "./Workflow"
|
|
63
|
+
export * from "./__overlays__/Tooltip/v1"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import classnames from "classnames"
|
|
2
|
+
|
|
3
|
+
type ClassNameValue = string | number | boolean | undefined | null
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Helper to merge classnames together with support for functions that receive state (render props).
|
|
7
|
+
* This is useful when working with react-aria-components which have a feature where you can pass a function that receives state and returns a classname.
|
|
8
|
+
* https://react-spectrum.adobe.com/react-aria/styling.html#render-props
|
|
9
|
+
*/
|
|
10
|
+
export const mergeClassNames = <
|
|
11
|
+
ClassNameTypes extends Array<ClassNameValue | ((state: any) => string)>,
|
|
12
|
+
>(
|
|
13
|
+
...classNames: ClassNameTypes
|
|
14
|
+
): (() => string) extends ClassNameTypes[number]
|
|
15
|
+
? (state: any) => string
|
|
16
|
+
: string => {
|
|
17
|
+
const containsFunction = classNames.some(
|
|
18
|
+
className => typeof className === "function"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
// "as any" is used because TS is not smart enough to know that containsFunction means that ClassNameType doesn't extend Function
|
|
22
|
+
if (!containsFunction)
|
|
23
|
+
return classnames(...(classNames as ClassNameValue[])) as any
|
|
24
|
+
|
|
25
|
+
// "as any" is used because TS is not smart enough to know that containsFunction means that ClassNameType doesn't extend Function
|
|
26
|
+
return ((state: any) =>
|
|
27
|
+
classnames(
|
|
28
|
+
...(classNames.map(className =>
|
|
29
|
+
typeof className === "function" ? className(state) : className
|
|
30
|
+
) as ClassNameValue[])
|
|
31
|
+
)) as any
|
|
32
|
+
}
|