@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.
Files changed (204) hide show
  1. package/dist/cjs/Button/GenericButton/GenericButton.cjs +89 -82
  2. package/dist/cjs/Button/GenericButton/GenericButton.module.scss.cjs +2 -1
  3. package/dist/cjs/ButtonGroup/ButtonGroup.cjs +4 -4
  4. package/dist/cjs/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.cjs +2 -2
  5. package/dist/cjs/GuidanceBlock/GuidanceBlock.cjs +2 -2
  6. package/dist/cjs/KaizenProvider/KaizenProvider.cjs +1 -1
  7. package/dist/cjs/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.cjs +11 -2
  8. package/dist/cjs/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.cjs +1 -2
  9. package/dist/cjs/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.cjs +2 -2
  10. package/dist/cjs/Table/Table.cjs +2 -2
  11. package/dist/cjs/Tabs/subcomponents/Tab.cjs +20 -14
  12. package/dist/cjs/__future__/Workflow/subcomponents/Header/Header.cjs +1 -1
  13. package/dist/cjs/__overlays__/Focusable/v3/Focusable.cjs +33 -0
  14. package/dist/cjs/__overlays__/Focusable/v3/Focusable.module.scss.cjs +6 -0
  15. package/dist/cjs/__overlays__/Tooltip/v1/Tooltip.module.scss.cjs +21 -0
  16. package/dist/cjs/__overlays__/Tooltip/v1/index.cjs +8 -0
  17. package/dist/cjs/__overlays__/Tooltip/v3/OverlayArrow.cjs +32 -0
  18. package/dist/cjs/__overlays__/Tooltip/v3/OverlayArrow.module.scss.cjs +7 -0
  19. package/dist/cjs/__overlays__/Tooltip/v3/Tooltip.cjs +59 -0
  20. package/dist/cjs/__overlays__/Tooltip/v3/Tooltip.module.scss.cjs +8 -0
  21. package/dist/cjs/__overlays__/Tooltip/v3/TooltipTrigger.cjs +24 -0
  22. package/dist/cjs/__utilities__/ReversedColors/v3/ReversedColors.cjs +23 -0
  23. package/dist/cjs/index.cjs +2 -2
  24. package/dist/cjs/overlaysV1.cjs +4 -0
  25. package/dist/cjs/overlaysV2.cjs +4 -0
  26. package/dist/cjs/overlaysV3.cjs +15 -0
  27. package/dist/cjs/reactAriaComponentsV3.cjs +11 -0
  28. package/dist/cjs/reactAriaV3.cjs +11 -0
  29. package/dist/cjs/utilitiesV3.cjs +5 -0
  30. package/dist/cjs/utils/mergeClassNames.cjs +33 -0
  31. package/dist/esm/Button/GenericButton/GenericButton.mjs +90 -82
  32. package/dist/esm/Button/GenericButton/GenericButton.module.scss.mjs +2 -1
  33. package/dist/esm/ButtonGroup/ButtonGroup.mjs +1 -1
  34. package/dist/esm/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.mjs +1 -1
  35. package/dist/esm/GuidanceBlock/GuidanceBlock.mjs +1 -1
  36. package/dist/esm/KaizenProvider/KaizenProvider.mjs +1 -1
  37. package/dist/esm/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.mjs +11 -2
  38. package/dist/esm/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.mjs +1 -2
  39. package/dist/esm/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.mjs +1 -1
  40. package/dist/esm/Table/Table.mjs +1 -1
  41. package/dist/esm/Tabs/subcomponents/Tab.mjs +21 -15
  42. package/dist/esm/__future__/Workflow/subcomponents/Header/Header.mjs +1 -1
  43. package/dist/esm/__overlays__/Focusable/v3/Focusable.mjs +24 -0
  44. package/dist/esm/__overlays__/Focusable/v3/Focusable.module.scss.mjs +4 -0
  45. package/dist/esm/__overlays__/Tooltip/v1/Tooltip.module.scss.mjs +19 -0
  46. package/dist/esm/__overlays__/Tooltip/v1/index.mjs +6 -0
  47. package/dist/esm/__overlays__/Tooltip/v3/OverlayArrow.mjs +24 -0
  48. package/dist/esm/__overlays__/Tooltip/v3/OverlayArrow.module.scss.mjs +5 -0
  49. package/dist/esm/__overlays__/Tooltip/v3/Tooltip.mjs +46 -0
  50. package/dist/esm/__overlays__/Tooltip/v3/Tooltip.module.scss.mjs +6 -0
  51. package/dist/esm/__overlays__/Tooltip/v3/TooltipTrigger.mjs +16 -0
  52. package/dist/esm/__utilities__/ReversedColors/v3/ReversedColors.mjs +14 -0
  53. package/dist/esm/index.mjs +1 -1
  54. package/dist/esm/overlaysV1.mjs +1 -0
  55. package/dist/esm/overlaysV2.mjs +1 -0
  56. package/dist/esm/overlaysV3.mjs +4 -0
  57. package/dist/esm/reactAriaComponentsV3.mjs +1 -0
  58. package/dist/esm/reactAriaV3.mjs +1 -0
  59. package/dist/esm/utilitiesV3.mjs +1 -0
  60. package/dist/esm/utils/mergeClassNames.mjs +25 -0
  61. package/dist/styles.css +18 -15
  62. package/dist/types/Button/GenericButton/GenericButton.d.ts +2 -1
  63. package/dist/types/ButtonGroup/ButtonGroup.d.ts +1 -1
  64. package/dist/types/Container/Container.d.ts +1 -1
  65. package/dist/types/Content/Content.d.ts +1 -1
  66. package/dist/types/DateInput/DateInput/DateInput.d.ts +1 -1
  67. package/dist/types/DatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  68. package/dist/types/Filter/FilterButton/subcomponents/FilterButtonBase/FilterButtonBase.d.ts +1 -1
  69. package/dist/types/Filter/FilterDatePicker/subcomponents/DateInputField/DateInputField.d.ts +1 -1
  70. package/dist/types/GuidanceBlock/GuidanceBlock.d.ts +1 -1
  71. package/dist/types/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.d.ts +2 -2
  72. package/dist/types/Notification/subcomponents/GenericNotification/GenericNotification.d.ts +1 -1
  73. package/dist/types/Select/Select.d.ts +3 -3
  74. package/dist/types/__future__/Select/Select.d.ts +2 -2
  75. package/dist/types/__future__/Select/subcomponents/SelectToggle/SelectToggle.d.ts +2 -2
  76. package/dist/types/__overlays__/Focusable/v3/Focusable.d.ts +6 -0
  77. package/dist/types/__overlays__/Focusable/v3/index.d.ts +1 -0
  78. package/dist/types/__overlays__/Tooltip/v1/index.d.ts +8 -0
  79. package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.d.ts +2 -2
  80. package/dist/types/__overlays__/Tooltip/v2/index.d.ts +1 -0
  81. package/dist/types/__overlays__/Tooltip/v3/OverlayArrow.d.ts +7 -0
  82. package/dist/types/__overlays__/Tooltip/v3/Tooltip.d.ts +32 -0
  83. package/dist/types/__overlays__/Tooltip/v3/TooltipTrigger.d.ts +19 -0
  84. package/dist/types/__overlays__/Tooltip/v3/index.d.ts +2 -0
  85. package/dist/types/__overlays__/v1.d.ts +1 -0
  86. package/dist/types/__overlays__/v2.d.ts +1 -0
  87. package/dist/types/__overlays__/v3.d.ts +2 -0
  88. package/dist/types/__react-aria-components__/index.d.ts +1 -0
  89. package/dist/types/__react-aria__/index.d.ts +1 -0
  90. package/dist/types/__utilities__/ReversedColors/v3/ReversedColors.d.ts +7 -0
  91. package/dist/types/__utilities__/ReversedColors/v3/index.d.ts +1 -0
  92. package/dist/types/__utilities__/v3.d.ts +1 -0
  93. package/dist/types/index.d.ts +1 -1
  94. package/dist/types/utils/getNodeText.d.ts +1 -2
  95. package/dist/types/utils/mergeClassNames.d.ts +8 -0
  96. package/package.json +6 -1
  97. package/src/Button/Button/Button.module.scss +33 -23
  98. package/src/Button/GenericButton/GenericButton.tsx +135 -91
  99. package/src/Button/utils/_mixins.scss +1 -1
  100. package/src/ButtonGroup/ButtonGroup.tsx +1 -1
  101. package/src/ButtonGroup/_docs/ButtonGroup.stickersheet.stories.tsx +1 -1
  102. package/src/Filter/FilterButton/FilterButtonRemovable/FilterButtonRemovable.tsx +1 -1
  103. package/src/GuidanceBlock/GuidanceBlock.tsx +1 -1
  104. package/src/KaizenProvider/KaizenProvider.tsx +5 -7
  105. package/src/KaizenProvider/subcomponents/OptionalIntlProvider/OptionalIntlProvider.tsx +14 -4
  106. package/src/MultiSelect/subcomponents/MultiSelectToggle/MultiSelectToggle.tsx +1 -1
  107. package/src/Notification/subcomponents/GenericNotification/GenericNotification.tsx +1 -1
  108. package/src/RichTextEditor/RichTextEditor/subcomponents/ToggleIconButton/ToggleIconButton.tsx +1 -1
  109. package/src/Table/Table.tsx +1 -1
  110. package/src/Tabs/_docs/Tabs.stories.tsx +1 -1
  111. package/src/Tabs/subcomponents/Tab.tsx +27 -21
  112. package/src/__future__/Workflow/subcomponents/Header/Header.tsx +1 -1
  113. package/src/__overlays__/Focusable/v3/Focusable.module.scss +3 -0
  114. package/src/__overlays__/Focusable/v3/Focusable.tsx +37 -0
  115. package/src/__overlays__/Focusable/v3/_docs/ApiSpecification.mdx +38 -0
  116. package/src/__overlays__/Focusable/v3/_docs/Focusable.stories.tsx +24 -0
  117. package/src/__overlays__/Focusable/v3/index.ts +1 -0
  118. package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.module.scss +1 -1
  119. package/src/__overlays__/Tooltip/v1/_docs/Tooltip.mdx +139 -0
  120. package/src/{Tooltip → __overlays__/Tooltip/v1}/_docs/Tooltip.stickersheet.stories.tsx +1 -1
  121. package/src/{Tooltip → __overlays__/Tooltip/v1}/_docs/Tooltip.stories.tsx +2 -2
  122. package/src/__overlays__/Tooltip/v1/index.ts +7 -0
  123. package/src/{Tooltip → __overlays__/Tooltip/v2}/_docs/Tooltip.mdx +2 -4
  124. package/src/__overlays__/Tooltip/v2/_docs/Tooltip.stories.tsx +49 -0
  125. package/src/__overlays__/Tooltip/v2/index.ts +1 -0
  126. package/src/__overlays__/Tooltip/v3/OverlayArrow.module.scss +43 -0
  127. package/src/__overlays__/Tooltip/v3/OverlayArrow.tsx +34 -0
  128. package/src/__overlays__/Tooltip/v3/Tooltip.module.scss +67 -0
  129. package/src/__overlays__/Tooltip/v3/Tooltip.tsx +101 -0
  130. package/src/__overlays__/Tooltip/v3/TooltipTrigger.tsx +30 -0
  131. package/src/__overlays__/Tooltip/v3/_docs/ApiSpecification.mdx +163 -0
  132. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.docs.stories.tsx +203 -0
  133. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.mdx +182 -0
  134. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.spec.stories.tsx +219 -0
  135. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stickersheet.stories.tsx +46 -0
  136. package/src/__overlays__/Tooltip/v3/_docs/Tooltip.stories.tsx +72 -0
  137. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_anatomy.png +0 -0
  138. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_placement.png +0 -0
  139. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_1.png +0 -0
  140. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_2.png +0 -0
  141. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_trigger_3.png +0 -0
  142. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_variant.png +0 -0
  143. package/src/__overlays__/Tooltip/v3/_docs/assets/tooltip_when_to_use.png +0 -0
  144. package/src/__overlays__/Tooltip/v3/index.ts +2 -0
  145. package/src/__overlays__/v1.ts +1 -0
  146. package/src/__overlays__/v2.ts +2 -0
  147. package/src/__overlays__/v3.ts +2 -0
  148. package/src/__react-aria-components__/index.ts +1 -0
  149. package/src/__react-aria__/index.ts +1 -0
  150. package/src/__utilities__/ReversedColors/v3/ReversedColors.tsx +20 -0
  151. package/src/__utilities__/ReversedColors/v3/index.ts +1 -0
  152. package/src/__utilities__/v3.ts +1 -0
  153. package/src/index.ts +1 -1
  154. package/src/types/cssVariables.d.ts +7 -0
  155. package/src/utils/mergeClassNames.ts +32 -0
  156. package/v1/overlays/package.json +5 -0
  157. package/v2/overlays/package.json +5 -0
  158. package/v3/overlays/package.json +5 -0
  159. package/v3/react-aria/package.json +5 -0
  160. package/v3/react-aria-components/package.json +5 -0
  161. package/dist/cjs/Tooltip/Tooltip.module.scss.cjs +0 -21
  162. package/dist/esm/Tooltip/Tooltip.module.scss.mjs +0 -19
  163. package/dist/types/AvatarGroup/_docs/example-data.d.ts +0 -8
  164. package/dist/types/BrandMoment/_docs/ExampleHeaders.d.ts +0 -3
  165. package/dist/types/Calendar/_docs/controls/defaultMonthControls.d.ts +0 -2
  166. package/dist/types/Calendar/_docs/controls/weekStartsOnControls.d.ts +0 -2
  167. package/dist/types/DatePicker/_docs/controls/datePickerLocaleControls.d.ts +0 -2
  168. package/dist/types/DatePicker/_docs/controls/disabledDayMatchersControls.d.ts +0 -2
  169. package/dist/types/Filter/FilterBar/context/types.d.ts +0 -28
  170. package/dist/types/Filter/FilterDatePicker/_docs/controls/disabledDaysControls.d.ts +0 -2
  171. package/dist/types/Filter/FilterDatePicker/_docs/controls/validationControls.d.ts +0 -2
  172. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/disabledDaysControls.d.ts +0 -2
  173. package/dist/types/Filter/FilterDateRangePicker/_docs/controls/validationControls.d.ts +0 -2
  174. package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +0 -10
  175. package/dist/types/Filter/FilterSelect/_docs/mockData.d.ts +0 -6
  176. package/dist/types/Filter/_docs/controls/renderTriggerControls.d.ts +0 -2
  177. package/dist/types/Menu/_docs/MenuContentExample.d.ts +0 -8
  178. package/dist/types/Menu/_docs/examples.d.ts +0 -11
  179. package/dist/types/Modal/_docs/controls.d.ts +0 -11
  180. package/dist/types/MultiSelect/MultiSelect.d.ts +0 -23
  181. package/dist/types/MultiSelect/subcomponents/MultiSelectOptions/MultiSelectOptions.d.ts +0 -13
  182. package/dist/types/Tooltip/index.d.ts +0 -1
  183. package/dist/types/Workflow/_docs/controls/controls.d.ts +0 -2
  184. package/dist/types/Workflow/_docs/controls/index.d.ts +0 -1
  185. package/dist/types/__future__/Select/_docs/mockData.d.ts +0 -6
  186. package/dist/types/__future__/Select/types.d.ts +0 -22
  187. package/dist/types/__future__/Workflow/_docs/controls/controls.d.ts +0 -2
  188. package/dist/types/__future__/Workflow/_docs/controls/index.d.ts +0 -1
  189. package/src/Tooltip/index.ts +0 -1
  190. /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.cjs +0 -0
  191. /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.cjs +0 -0
  192. /package/dist/cjs/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.cjs +0 -0
  193. /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.mjs +0 -0
  194. /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.mjs +0 -0
  195. /package/dist/esm/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.mjs +0 -0
  196. /package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.d.ts +0 -0
  197. /package/dist/types/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.d.ts +0 -0
  198. /package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.spec.tsx +0 -0
  199. /package/src/{Tooltip → __overlays__/Tooltip/v1}/Tooltip.tsx +0 -0
  200. /package/src/{Tooltip → __overlays__/Tooltip/v1}/_variables.scss +0 -0
  201. /package/src/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.spec.tsx +0 -0
  202. /package/src/{Tooltip → __overlays__/Tooltip/v1}/subcomponents/AppearanceAnim.tsx +0 -0
  203. /package/src/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.spec.tsx +0 -0
  204. /package/src/{Tooltip → __overlays__/Tooltip/v1}/utils/isSemanticElement.tsx +0 -0
@@ -1,10 +1,11 @@
1
- import React, { useContext } from "react"
1
+ import React, { ReactNode, useContext } from "react"
2
2
  import { StaticIntlProvider } from "@cultureamp/i18n-react-intl"
3
+ import { I18nProvider } from "react-aria"
3
4
  import { IntlContext } from "react-intl"
4
5
 
5
6
  type Props = {
6
7
  locale: string
7
- children: React.ReactElement
8
+ children: ReactNode
8
9
  }
9
10
  export const OptionalIntlProvider = ({
10
11
  locale,
@@ -12,8 +13,17 @@ export const OptionalIntlProvider = ({
12
13
  }: Props): JSX.Element => {
13
14
  const parent = useContext(IntlContext)
14
15
 
15
- if (parent) return children
16
- return <StaticIntlProvider locale={locale}>{children}</StaticIntlProvider>
16
+ if (parent) {
17
+ // we always wrap with react-aria provider as we have no way checking if parent is wrapped (useLocale returns default value if not)
18
+ // but it's not a big deal as we'll consume the defined locale anyways so no effect on children
19
+ return <I18nProvider locale={parent.locale}>{children}</I18nProvider>
20
+ }
21
+
22
+ return (
23
+ <StaticIntlProvider locale={locale}>
24
+ <I18nProvider locale={locale}>{children}</I18nProvider>
25
+ </StaticIntlProvider>
26
+ )
17
27
  }
18
28
 
19
29
  OptionalIntlProvider.displayName = "OptionalIntlProvider"
@@ -3,7 +3,7 @@ import classnames from "classnames"
3
3
  import { ClearButton } from "~components/ClearButton"
4
4
  import { FieldMessageProps } from "~components/FieldMessage"
5
5
  import { ChevronDownIcon, ChevronUpIcon } from "~components/Icon"
6
- import { RemovableTag } from "~components/__future__/Tag"
6
+ import { RemovableTag } from "~components/__future__"
7
7
  import { OverrideClassName } from "~types/OverrideClassName"
8
8
  import { MultiSelectOption } from "../../types"
9
9
  import styles from "./MultiSelectToggle.module.scss"
@@ -18,7 +18,7 @@ export type GenericNotificationProps = {
18
18
  noBottomMargin?: boolean
19
19
  forceMultiline?: boolean
20
20
  headingProps?: HeadingProps
21
- } & OverrideClassName<HTMLAttributes<HTMLDivElement>>
21
+ } & Omit<OverrideClassName<HTMLAttributes<HTMLDivElement>>, "style">
22
22
 
23
23
  export const GenericNotification = ({
24
24
  type,
@@ -1,6 +1,6 @@
1
1
  import React from "react"
2
2
  import classnames from "classnames"
3
- import { Tooltip } from "~components/Tooltip"
3
+ import { Tooltip } from "~components/__overlays__/Tooltip/v1"
4
4
  import { OverrideClassName } from "~types/OverrideClassName"
5
5
  import { ToggleIconButtonMoods } from "./types"
6
6
  import styles from "./ToggleIconButton.module.scss"
@@ -7,7 +7,7 @@ import {
7
7
  SortAscendingIcon,
8
8
  SortDescendingIcon,
9
9
  } from "~components/Icon"
10
- import { Tooltip } from "~components/Tooltip"
10
+ import { Tooltip } from "~components/__overlays__/Tooltip/v1"
11
11
  import { OverrideClassName } from "~types/OverrideClassName"
12
12
  import styles from "./Table.module.scss"
13
13
 
@@ -3,7 +3,7 @@ import { Meta, StoryObj } from "@storybook/react"
3
3
  import { Button } from "~components/Button"
4
4
  import { Card } from "~components/Card"
5
5
  import { Text } from "~components/Text"
6
- import { Tabs, TabList, Tab, TabPanels, TabPanel } from "../index"
6
+ import { Tab, TabList, TabPanel, TabPanels, Tabs } from "../index"
7
7
 
8
8
  const meta = {
9
9
  title: "Components/Tabs",
@@ -1,11 +1,13 @@
1
1
  import React, {
2
2
  HTMLAttributes,
3
3
  ReactNode,
4
- useState,
5
4
  SyntheticEvent,
5
+ useRef,
6
+ useState,
6
7
  } from "react"
7
8
  import { Tab as ReachTab } from "@reach/tabs"
8
9
  import classnames from "classnames"
10
+ import { useFocusable } from "react-aria"
9
11
  import { Badge } from "~components/Badge"
10
12
  import { OverrideClassName } from "~types/OverrideClassName"
11
13
  import styles from "./Tab.module.scss"
@@ -44,34 +46,38 @@ export const Tab = (props: TabProps): JSX.Element => {
44
46
  classNameOverride,
45
47
  ...restProps
46
48
  } = props
49
+ const ref = useRef<HTMLButtonElement>(null)
47
50
  const [isHovered, setIsHovered] = useState<boolean>(false)
48
51
  const [isFocused, setIsFocused] = useState<boolean>(false)
49
52
  const showActiveBadge = isSelected || isHovered || isFocused
50
53
 
51
- const onFocus = (event: SyntheticEvent): void => {
52
- setIsFocused(true)
53
- props.onFocus?.(event)
54
+ const tabProps = {
55
+ disabled,
56
+ className: classnames(
57
+ styles.tab,
58
+ classNameOverride,
59
+ isSelected && styles.selected
60
+ ),
61
+ onFocus: (event: SyntheticEvent): void => {
62
+ setIsFocused(true)
63
+ props.onFocus?.(event)
64
+ },
65
+ onBlur: (event: SyntheticEvent): void => {
66
+ setIsFocused(false)
67
+ props.onBlur?.(event)
68
+ },
69
+ onMouseEnter: (): void => setIsHovered(true),
70
+ onMouseLeave: (): void => setIsHovered(false),
71
+ ...restProps,
54
72
  }
55
73
 
56
- const onBlur = (event: SyntheticEvent): void => {
57
- setIsFocused(false)
58
- props.onBlur?.(event)
59
- }
74
+ const { focusableProps } = useFocusable(tabProps, ref)
75
+
76
+ // Reach is setting and managing tabIndex for us here, so we remove it from the focusableProps (also it needs to be non-defined, undefined is not enough)
77
+ delete focusableProps.tabIndex
60
78
 
61
79
  return (
62
- <ReachTab
63
- disabled={disabled}
64
- className={classnames(
65
- styles.tab,
66
- classNameOverride,
67
- isSelected && styles.selected
68
- )}
69
- onFocus={onFocus}
70
- onBlur={onBlur}
71
- onMouseEnter={(): void => setIsHovered(true)}
72
- onMouseLeave={(): void => setIsHovered(false)}
73
- {...restProps}
74
- >
80
+ <ReachTab ref={ref} {...tabProps} {...focusableProps}>
75
81
  {children}
76
82
  {badge && (
77
83
  <span className={styles.badge}>
@@ -18,7 +18,7 @@ export const Header = ({
18
18
  ...restProps
19
19
  }: HeaderProps): JSX.Element => (
20
20
  <HeaderRoot {...restProps}>
21
- <Branding alt="Cultureamp" />
21
+ <Branding alt="Culture Amp" />
22
22
  <Titles workflowName={workflowName} stepName={stepName} status={status} />
23
23
  <Actions headerActions={headerActions} />
24
24
  </HeaderRoot>
@@ -0,0 +1,3 @@
1
+ .focusableWrapper {
2
+ display: inline-flex;
3
+ }
@@ -0,0 +1,37 @@
1
+ import React, { HTMLAttributes, ReactNode, useRef } from "react"
2
+ import classnames from "classnames"
3
+ import { FocusableOptions, useFocusable } from "react-aria"
4
+ import styles from "./Focusable.module.scss"
5
+
6
+ export type FocusableProps = {
7
+ children: ReactNode
8
+ } & FocusableOptions &
9
+ HTMLAttributes<HTMLDivElement>
10
+
11
+ export const Focusable = ({
12
+ children,
13
+ className,
14
+ ...props
15
+ }: FocusableProps): JSX.Element => {
16
+ const ref = useRef<HTMLDivElement>(null)
17
+ const { focusableProps } = useFocusable(props, ref)
18
+
19
+ return (
20
+ <div
21
+ ref={ref}
22
+ className={classnames(styles.focusableWrapper, className)}
23
+ {...focusableProps}
24
+ data-inline-hidden-content
25
+ // We want the div to be focusable for keyboard users,
26
+ // but screen readers will have the VisuallyHidden content
27
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
28
+ tabIndex={0}
29
+ // aria-describedby on div doesn't do anthing so we instead render the content in VisuallyHidden from tooltip
30
+ // but because RAC adds it as it assumes it's interactive element we remove it here
31
+ aria-describedby={undefined}
32
+ {...props}
33
+ >
34
+ {children}
35
+ </div>
36
+ )
37
+ }
@@ -0,0 +1,38 @@
1
+ import { Canvas, Controls, Meta } from "@storybook/blocks"
2
+ import { KAIOInstallation, ResourceLinks, SbContent } from "~storybook/components"
3
+ import * as exampleStories from "./Focusable.stories"
4
+
5
+ <Meta title="Overlays/Focusable/v3/API Specification"/>
6
+
7
+ <SbContent>
8
+ # Focusable API Specification (v3)
9
+
10
+ Updated June 25, 2024
11
+ </SbContent>
12
+
13
+ <ResourceLinks
14
+ sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/__overlays__/Focusable"
15
+ className="mt-16 !mb-8"
16
+ />
17
+
18
+ <SbContent className="mb-24">
19
+ <KAIOInstallation exportNames={["Focusable"]} family="overlays" version="3" />
20
+
21
+ ## Overview
22
+
23
+ Focusable is a utility wrapper to allow users to add focus to a non-focusable element.
24
+
25
+ The main use case is for non semantic components like `Tag` that need a [Tooltip](/docs/overlays-tooltip-v3-usage-guidelines--docs).
26
+ </SbContent>
27
+
28
+ <Canvas className="mb-24" of={exampleStories.Playground} />
29
+
30
+ <SbContent className="mb-64">
31
+ Be aware that this does not negate the need to meet A11Y standards and best practices. Use this utility wrapper with caution.
32
+ </SbContent>
33
+
34
+ <SbContent className="mb-12">
35
+ ## API
36
+ </SbContent>
37
+
38
+ <Controls of={exampleStories.Playground} />
@@ -0,0 +1,24 @@
1
+ import React from "react"
2
+ import { Meta, StoryObj } from "@storybook/react"
3
+ import { Tag } from "~components/__future__/Tag"
4
+ import { Focusable } from "../index"
5
+
6
+ const meta = {
7
+ title: "Overlays/Focusable/v3",
8
+ component: Focusable,
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ } satisfies Meta<typeof Focusable>
13
+
14
+ export default meta
15
+
16
+ type Story = StoryObj<typeof Focusable>
17
+
18
+ export const Playground: Story = {
19
+ render: args => (
20
+ <Focusable {...args}>
21
+ <Tag>Name</Tag>
22
+ </Focusable>
23
+ ),
24
+ }
@@ -0,0 +1 @@
1
+ export * from "./Focusable"
@@ -3,7 +3,7 @@
3
3
  @import "~@kaizen/design-tokens/sass/color";
4
4
  @import "~@kaizen/design-tokens/sass/animation";
5
5
  @import "~@kaizen/design-tokens/sass/typography";
6
- @import "../../styles/utils/layers";
6
+ @import "../../../../styles/utils/layers";
7
7
  @import "./variables";
8
8
 
9
9
  .tooltip {
@@ -0,0 +1,139 @@
1
+ import { Canvas, Controls, Meta } from "@storybook/blocks"
2
+ import { ResourceLinks, Installation } from "~storybook/components"
3
+ import * as TooltipStories from "./Tooltip.stories"
4
+
5
+ <Meta of={TooltipStories} />
6
+
7
+ # Tooltip (v1)
8
+
9
+ <ResourceLinks
10
+ sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/Tooltip"
11
+ 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"
12
+ designGuidelines="https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3075604978/Tooltip"
13
+ className="!mb-8"
14
+ />
15
+
16
+ <Installation
17
+ installCommand="pnpm add @kaizen/components"
18
+ importStatement='import { Tooltip } from "@kaizen/components/v1/overlays"'
19
+ />
20
+
21
+ It is recommended that you import from the `v2` entry point.
22
+
23
+
24
+ ## Overview
25
+
26
+ Adds a popover that will show on hover or focus of the child element, with simple text content.
27
+
28
+ <Canvas of={TooltipStories.Playground} />
29
+ <Controls of={TooltipStories.Playground} />
30
+
31
+ ## Accessibility
32
+
33
+ This component wasn't built with accessibility in mind, as a result it's quite easy to implement a tooltip in a non-accessible way. A rethink and rewrite is likely for the future.
34
+
35
+ There's two major accessibility concerns here:
36
+ - Keyboard only users
37
+ - Screen reader (or similar assistive tech) users
38
+
39
+ Failure to meet either of these requirements will result in a critical issue where some people are completely unable to access the information.
40
+
41
+ ### Keyboard accessibility
42
+
43
+ For keyboard accessibility, you need to make sure the child you are passing is a focusable element. It's best to keep the contents of this component simple. E.g. just a button:
44
+
45
+ ```jsx
46
+ <Tooltip text="Opens in a new tab">
47
+ <Button href="/path" label="Go somewhere" />
48
+ </Tooltip>
49
+ ```
50
+
51
+ ### Screen reader accessibility
52
+
53
+ Though it won't guarantee the best screen reader accessibility, a good start is to make sure your _direct_ children element is semantic (not a div or span).
54
+
55
+ When your direct child element is semantic, this component will add an `aria-describedby` to that element. E.g. for the link example above, the resulting mark up will be:
56
+
57
+ ```html
58
+ <a href="path" aria-describedby="tooltip">Go somewhere</a>
59
+ <!-- (in a portal) -->
60
+ <div id="tooltip-id">Opens in a new tab</div>
61
+ ```
62
+
63
+ Resulting in a screen reader announcement like:
64
+ `Go somewhere, link, Opens in a new tab`
65
+
66
+ Again, try to keep the contents of your children as simple as possible, ideally only a single natively focusable element like the example above.
67
+
68
+ When your direct child is not semantic, you will get a console warning like this:
69
+ `<Tooltip /> is not directly wrapping a semantic element, screen reader users will not be able to access the tooltip info.`
70
+
71
+
72
+ ### Tooltips, Kaizen components and avoiding common pitfalls
73
+
74
+ While technically any Kaizen component can be wrapped by a `Tooltip`, as called out previously, only those with [accessible roles](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles) like `button`, `link` or `heading`, will be readable to assistive technologies.
75
+
76
+ We've created some guidance below with the most common cases for `Tooltip` and how to ensure the additional context is read to the user.
77
+
78
+ #### Button and IconButton
79
+
80
+ <Canvas of={TooltipStories.ButtonsWithTooltip} />
81
+
82
+ While Kaizen buttons are compatible with `Tooltip`, caution is advised when using the custom `component` render prop.
83
+
84
+ ```JSX
85
+ <Tooltip text="Contact customer support.">
86
+ <Button
87
+ {...buttonProps}
88
+ component={() => (
89
+ // The most immediate child is a `div`, which has no `role`.
90
+ <div>
91
+ <button type="button">
92
+ Help
93
+ </button>
94
+ </div>
95
+ )}
96
+ />
97
+ </Tooltip>
98
+ ```
99
+
100
+ In the example above, the `div` in now the direct descendant of `Tooltip`, therefore will no longer be accessible to assistive technologies.
101
+
102
+ #### ButtonGroup
103
+
104
+ The `Tooltip` component must wrap the children of `ButtonGroup` to be accessible to screen readers.
105
+
106
+ <Canvas of={TooltipStories.ButtonGroupWithTooltip} />
107
+
108
+ #### Table headers and tooltips
109
+
110
+ While the composable `Tooltip` is not exposed in the Kaizen `Table`, it is important to call out that the `tooltipInfo` prop in `TableHeaderRowCell` must also have an `onClick` or `href` to be announced to assistive technologies.
111
+
112
+ <Canvas of={TooltipStories.TableHeadersWithTooltips} />
113
+
114
+ Without either of these, the `Tooltip` content will not be readable to keyboard users or assistive technologies.
115
+
116
+ #### Tags
117
+
118
+ Seen in the example below simple `Tag`s with plain text as `children` will not accessible to keyboard users or assistive technologies as it's direct descendant is a `div` with no semantic `role`.
119
+
120
+ <Canvas of={TooltipStories.TagWithHoverOnlyTooltip} />
121
+
122
+ While `Tooltip` should be avoided if there are no interactive states within the `Tag`, internal elements like buttons or links can be wrapped in a `Tooltip` component to add necessary context.
123
+
124
+ <Canvas of={TooltipStories.TagWithTooltip} />
125
+
126
+ The [future Tag](?path=/docs/components-tag-future--docs#overview) offers a composable solution for those needing to add more context to an interactive `Tag`.
127
+
128
+ #### Form components and tooltips
129
+
130
+ While a `Tooltip` can seem like a natural pairing when space is a commodity, form elements still require a concise label that is _ideally_ visible (See MDN's guide on [Tooltip best practices](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/tooltip_role#best_practices)).
131
+
132
+ <Canvas of={TooltipStories.CheckboxFieldTooltip} />
133
+
134
+ In the example above, the `Tooltip` content `"Select all users"` is accessible to screen readers via keyboard navigation, however will not be announced when the input receives focus. This a limitation of `CheckboxField` and form components where the immediate `children` of `Tooltip` is a wrapper.
135
+
136
+ <Canvas of={TooltipStories.CheckboxFieldWithDescriptionTooltip} />
137
+
138
+ In these instances, `aria-describedby` can be leveraged to provide a description to the input.
139
+
@@ -15,7 +15,7 @@ const openTooltipInChromatic: Decorator = (Story, { args }) => {
15
15
  }
16
16
 
17
17
  export default {
18
- title: "Components/Tooltip",
18
+ title: "Overlays/Tooltip/v1",
19
19
  parameters: {
20
20
  chromatic: { disable: false },
21
21
  controls: { disable: true },
@@ -12,11 +12,11 @@ import {
12
12
  TableRow,
13
13
  } from "~components/Table"
14
14
  import { Text } from "~components/Text"
15
- import { Tag } from "~components/__future__"
15
+ import { Tag } from "~components/__future__/Tag"
16
16
  import { Tooltip } from "../index"
17
17
 
18
18
  const meta = {
19
- title: "Components/Tooltip",
19
+ title: "Overlays/Tooltip/v1",
20
20
  component: Tooltip,
21
21
  args: {
22
22
  text: "Example tooltip text.",
@@ -0,0 +1,7 @@
1
+ // Since we can't add a deprecation flag on a * export
2
+ import { Tooltip as TooltipV1, TooltipProps as TooltipPropsV1 } from "./Tooltip"
3
+
4
+ /** * @deprecated use v2 or upgrade to v3 for the latest release */
5
+ export const Tooltip = TooltipV1
6
+ /** * @deprecated use v2 or upgrade to v3 for the latest release */
7
+ export type TooltipProps = TooltipPropsV1
@@ -4,16 +4,14 @@ import * as TooltipStories from "./Tooltip.stories"
4
4
 
5
5
  <Meta of={TooltipStories} />
6
6
 
7
- # Tooltip
7
+ # Tooltip (v2)
8
8
 
9
9
  <ResourceLinks
10
10
  sourceCode="https://github.com/cultureamp/kaizen-design-system/tree/main/packages/components/src/Tooltip"
11
11
  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"
12
- designGuidelines="https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3075604978/Tooltip"
13
- className="!mb-8"
14
12
  />
15
13
 
16
- <KAIOInstallation exportNames="Tooltip" />
14
+ <KAIOInstallation exportNames="Tooltip" family="overlays" version="2" />
17
15
 
18
16
  ## Overview
19
17
 
@@ -0,0 +1,49 @@
1
+ import React from "react"
2
+ import { Meta, StoryObj } from "@storybook/react"
3
+ import * as TooltipV1Stories from "../../v1/_docs/Tooltip.stories"
4
+ import { Tooltip } from "../index"
5
+
6
+ const meta = {
7
+ title: "Overlays/Tooltip/v2",
8
+ component: Tooltip,
9
+ args: {
10
+ text: "Example tooltip text.",
11
+ },
12
+ decorators: [
13
+ Story => (
14
+ <div className="flex mt-[60px] gap-12">
15
+ <Story />
16
+ </div>
17
+ ),
18
+ ],
19
+ parameters: {
20
+ layout: "centered",
21
+ },
22
+ } satisfies Meta<typeof Tooltip>
23
+
24
+ export default meta
25
+
26
+ type Story = StoryObj<typeof meta>
27
+
28
+ export const Playground: Story = TooltipV1Stories.Playground
29
+
30
+ export const OverflowScroll: Story = TooltipV1Stories.OverflowScroll
31
+
32
+ export const ButtonsWithTooltip: Story = TooltipV1Stories.ButtonsWithTooltip
33
+
34
+ export const ButtonGroupWithTooltip: Story = TooltipV1Stories.ButtonsWithTooltip
35
+
36
+ export const TableHeadersWithTooltips: Story =
37
+ TooltipV1Stories.TableHeadersWithTooltips
38
+
39
+ export const TagWithHoverOnlyTooltip: Story =
40
+ TooltipV1Stories.TagWithHoverOnlyTooltip
41
+
42
+ export const TagWithTooltip: Story = TooltipV1Stories.TagWithTooltip
43
+
44
+ export const TagWithCheckboxField: Story = TooltipV1Stories.TagWithCheckboxField
45
+
46
+ export const CheckboxFieldTooltip: Story = TooltipV1Stories.CheckboxFieldTooltip
47
+
48
+ export const CheckboxFieldWithDescriptionTooltip: Story =
49
+ TooltipV1Stories.CheckboxFieldWithDescriptionTooltip
@@ -0,0 +1 @@
1
+ export * from "../v1/Tooltip"
@@ -0,0 +1,43 @@
1
+ @import "~@kaizen/design-tokens/sass/shadow";
2
+ @import "~@kaizen/design-tokens/sass/color";
3
+
4
+ .overlayArrow {
5
+ display: flex;
6
+
7
+ // for correct arrow positioning with rounded corners we need to do bit trickery here
8
+ // the positioning is done in js in RAC and works by first getting size of arrow without data-placement, and isn't recomputed after update
9
+ // so we first set padding on arrow from all sides (that'll be used for start position computation)
10
+ // and then we remove it from the oposite axis
11
+ padding: 8px;
12
+
13
+ &[data-placement="top"],
14
+ &[data-placement="bottom"] {
15
+ padding: 0 8px;
16
+ }
17
+
18
+ &[data-placement="left"],
19
+ &[data-placement="right"] {
20
+ padding: 8px 0;
21
+ }
22
+
23
+ path {
24
+ fill: $color-purple-800;
25
+ box-shadow: $shadow-small-box-shadow;
26
+ }
27
+
28
+ &[data-placement="right"] svg {
29
+ transform: rotate(90deg);
30
+ }
31
+
32
+ &[data-placement="bottom"] svg {
33
+ transform: rotate(180deg);
34
+ }
35
+
36
+ &[data-placement="left"] svg {
37
+ transform: rotate(270deg);
38
+ }
39
+
40
+ &.reversed path {
41
+ fill: $color-white;
42
+ }
43
+ }
@@ -0,0 +1,34 @@
1
+ import React from "react"
2
+ import {
3
+ OverlayArrow as RACOverlayArrow,
4
+ type OverlayArrowProps,
5
+ } from "react-aria-components"
6
+ import { useReversedColors } from "~components/__utilities__/v3"
7
+ import { mergeClassNames } from "~utils/mergeClassNames"
8
+
9
+ import styles from "./OverlayArrow.module.scss"
10
+
11
+ export { type OverlayArrowProps }
12
+
13
+ /**
14
+ * An OverlayArrow renders a custom arrow element relative to an overlay element
15
+ * such as a popover or tooltip such that it aligns with a trigger element.
16
+ */
17
+ export const OverlayArrow = (props: OverlayArrowProps): JSX.Element => {
18
+ const reverseColors = useReversedColors()
19
+
20
+ return (
21
+ <RACOverlayArrow
22
+ {...props}
23
+ className={mergeClassNames(
24
+ styles.overlayArrow,
25
+ reverseColors && styles.reversed,
26
+ props.className
27
+ )}
28
+ >
29
+ <svg width={8} height={8} viewBox="0 0 8 8">
30
+ <path d="M0 0 L4 4 L8 0" />
31
+ </svg>
32
+ </RACOverlayArrow>
33
+ )
34
+ }