playbook_ui 15.6.0.pre.rc.2 → 15.6.0.pre.rc.4

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_background/_background.tsx +6 -6
  3. data/app/pb_kits/playbook/pb_background/background.test.js +5 -1
  4. data/app/pb_kits/playbook/pb_background/docs/_background_light.html.erb +1 -1
  5. data/app/pb_kits/playbook/pb_background/docs/_background_light.jsx +0 -1
  6. data/app/pb_kits/playbook/pb_background/docs/_background_light.md +1 -0
  7. data/app/pb_kits/playbook/pb_background/docs/example.yml +2 -2
  8. data/app/pb_kits/playbook/pb_dialog/index.js +10 -15
  9. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +34 -22
  10. data/app/pb_kits/playbook/pb_home_address_street/city_emphasis.html.erb +16 -12
  11. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.html.erb +1 -1
  12. data/app/pb_kits/playbook/pb_home_address_street/none_emphasis.html.erb +16 -12
  13. data/app/pb_kits/playbook/pb_home_address_street/street_emphasis.html.erb +16 -12
  14. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +10 -0
  15. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.tsx +66 -15
  16. data/app/pb_kits/playbook/pb_multiple_users/docs/_multiple_users_with_tooltip.jsx +42 -0
  17. data/app/pb_kits/playbook/pb_multiple_users/docs/_multiple_users_with_tooltip.md +1 -0
  18. data/app/pb_kits/playbook/pb_multiple_users/docs/example.yml +1 -0
  19. data/app/pb_kits/playbook/pb_multiple_users/docs/index.js +1 -0
  20. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.test.js +25 -0
  21. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +44 -10
  22. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.html.erb +34 -4
  23. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.jsx +16 -7
  24. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +15 -0
  25. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -0
  26. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +6 -1
  27. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +34 -7
  28. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_input_display.html.erb +30 -0
  29. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_input_display.jsx +37 -0
  30. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_input_display.md +3 -0
  31. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  32. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +2 -1
  33. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +6 -1
  34. data/dist/chunks/_typeahead-BXM7QUuy.js +6 -0
  35. data/dist/chunks/vendor.js +2 -2
  36. data/dist/playbook-rails-react-bindings.js +1 -1
  37. data/dist/playbook-rails.js +1 -1
  38. data/dist/playbook.css +1 -1
  39. data/lib/playbook/version.rb +1 -1
  40. metadata +9 -3
  41. data/dist/chunks/_typeahead-CkkCTRLh.js +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b983bad8c671234614b68b2b02908fb8c5ec33ba66bd8592f9302dcc71f739e5
4
- data.tar.gz: 8188f53eac0f277f4c35acee49a5e79fbcf7939dff69e0096d250df2083aa45e
3
+ metadata.gz: c34ed34894c77c65c7b4ab52a7b921200f1f96774c4512284549bee9f9b43763
4
+ data.tar.gz: faed7dd35f9e9c0cbc6702c305d8e6bb1a6b43f78c117931528ce1a4f47218d5
5
5
  SHA512:
6
- metadata.gz: 26d1e8728ead33b88b32b1fbf796a3f3aff34b5ce9bc064f4039a59fc9ca0f2d0ab1c11e06b18994581ae1adb1cd00f67e8c2bc7ec659b60925d168f043be206
7
- data.tar.gz: 6cddf1b537e290bcc98ef4be264e3d300c9ba9d29e45c2ebf0fc7723b19e194fbd67c2fcd766ebf1b53dd26d930eaefa38cefdbf1219f674c150e9251e9f6196
6
+ metadata.gz: 78bc97c590826a13a8f89f58d8898360064b91f464f92d660a479a45c1654c2716661a56c68028d951e918410b2aa6dec8806158653493952a3c9818756f1583
7
+ data.tar.gz: 838f146d76432cffe68da3a90d32b044dd59bb74157b5bb28b0d00aa34a8a060cc81ec50d5ed04e79bf574abd96ebf2c3aec6cec1330ad36dc51f41d7f6d926b
@@ -102,16 +102,16 @@ const Background = (props: BackgroundProps): React.ReactElement => {
102
102
  useEffect(() => {
103
103
  const updateResponsiveProps = () => {
104
104
  setResponsiveProps({
105
- backgroundSize: getResponsiveValue(props.backgroundSize),
106
- backgroundPosition: getResponsiveValue(props.backgroundPosition),
107
- backgroundRepeat: getResponsiveValue(props.backgroundRepeat),
108
- backgroundColor: getResponsiveValue(props.backgroundColor),
109
- imageUrl: getResponsiveValue(props.imageUrl),
105
+ backgroundSize: getResponsiveValue(backgroundSize),
106
+ backgroundPosition: getResponsiveValue(backgroundPosition),
107
+ backgroundRepeat: getResponsiveValue(backgroundRepeat),
108
+ backgroundColor: getResponsiveValue(backgroundColor),
109
+ imageUrl: getResponsiveValue(imageUrl),
110
110
  });
111
111
  };
112
112
  window.addEventListener('resize', updateResponsiveProps);
113
113
  return () => window.removeEventListener('resize', updateResponsiveProps);
114
- }, [props]);
114
+ }, [backgroundSize, backgroundPosition, backgroundRepeat, backgroundColor, imageUrl]);
115
115
 
116
116
 
117
117
  // Extract currently applicable responsive values.
@@ -4,7 +4,6 @@ import Background from './_background'
4
4
 
5
5
  const props = {
6
6
  data: { testid: 'background' },
7
- backgroundColor: null,
8
7
  }
9
8
 
10
9
  it('Should be accessible', async () => {
@@ -42,3 +41,8 @@ test('applies correct overlay class when imageOverlay prop is provided', () => {
42
41
  const kit = renderKit(Background, props, { imageOverlay: 'opacity_6' });
43
42
  expect(kit).toHaveClass('imageoverlay_opacity_6');
44
43
  });
44
+
45
+ test('Sets backgroundColor to light as default when no backgroundColor prop is provided', () => {
46
+ const kit = renderKit(Background, props);
47
+ expect(kit).toHaveClass('pb_background_color_light');
48
+ });
@@ -1,3 +1,3 @@
1
- <%= pb_rails("background", props: { background_color: "light", padding: "xl" }) do %>
1
+ <%= pb_rails("background", props: { padding: "xl" }) do %>
2
2
 
3
3
  <% end %>
@@ -3,7 +3,6 @@ import Background from '../../pb_background/_background'
3
3
 
4
4
  const BackgroundLight = (props) => (
5
5
  <Background
6
- backgroundColor="light"
7
6
  padding="xl"
8
7
  {...props}
9
8
  />
@@ -0,0 +1 @@
1
+ By default, the Background kit sets background color to 'light' as seen here.
@@ -1,7 +1,7 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
- - background_light: Light
4
+ - background_light: Default
5
5
  - background_white: White
6
6
  - background_gradient: Gradient
7
7
  - background_image: Image
@@ -11,7 +11,7 @@ examples:
11
11
  - background_size: Size
12
12
 
13
13
  react:
14
- - background_light: Light
14
+ - background_light: Default
15
15
  - background_white: White
16
16
  - background_gradient: Gradient
17
17
  - background_image: Image
@@ -143,30 +143,25 @@ export default class PbDialog extends PbEnhancedElement {
143
143
 
144
144
  // Close dialog box on outside click
145
145
  dialogs.forEach((dialogElement) => {
146
- const originalClickHandler = dialogElement._outsideClickHandler
147
- if (originalClickHandler) dialogElement.removeEventListener("click", originalClickHandler)
148
-
146
+ const originalMousedownHandler = dialogElement._outsideClickHandler
147
+ if (originalMousedownHandler) dialogElement.removeEventListener("mousedown", originalMousedownHandler)
149
148
  dialogElement._outsideClickHandler = (event) => {
150
149
  const dialogParentDataset = dialogElement.parentElement.dataset
151
150
  if (dialogParentDataset.overlayClick === "overlay_close") return
152
151
 
153
- // Get the dialog's bounding box (the actual content area)
154
- const rect = dialogElement.getBoundingClientRect()
155
- const clickedInDialog = (
156
- event.clientX >= rect.left &&
157
- event.clientX <= rect.right &&
158
- event.clientY >= rect.top &&
159
- event.clientY <= rect.bottom
160
- )
161
-
162
- // Only close if clicked outside the dialog content (on the backdrop)
163
- if (!clickedInDialog) {
152
+ const dialogModal = event.target.getBoundingClientRect()
153
+ const clickedOutsideDialogModal = event.clientX < dialogModal.left ||
154
+ event.clientX > dialogModal.right ||
155
+ event.clientY < dialogModal.top ||
156
+ event.clientY > dialogModal.bottom
157
+
158
+ if (clickedOutsideDialogModal) {
164
159
  dialogElement.close()
165
160
  event.stopPropagation()
166
161
  }
167
162
  }
168
163
 
169
- dialogElement.addEventListener("click", dialogElement._outsideClickHandler);
164
+ dialogElement.addEventListener("mousedown", dialogElement._outsideClickHandler);
170
165
  })
171
166
  }
172
167
  }
@@ -96,20 +96,24 @@ const HomeAddressStreet = (props: HomeAddressStreetProps): React.ReactElement =>
96
96
  {hasAllEmptyProps && '—'}
97
97
  {emphasis == 'street' && !hasAllEmptyProps &&
98
98
  <div>
99
- <Title
100
- className="pb_home_address_street_address"
101
- dark={dark}
102
- size={4}
103
- >
104
- {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
105
- </Title>
106
- <Title
107
- className="pb_home_address_street_address"
108
- dark={dark}
109
- size={4}
110
- >
111
- {titleize(addressCont)}
112
- </Title>
99
+ {(address || houseStyle) && (
100
+ <Title
101
+ className="pb_home_address_street_address"
102
+ dark={dark}
103
+ size={4}
104
+ >
105
+ {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
106
+ </Title>
107
+ )}
108
+ {addressCont && (
109
+ <Title
110
+ className="pb_home_address_street_address"
111
+ dark={dark}
112
+ size={4}
113
+ >
114
+ {titleize(addressCont)}
115
+ </Title>
116
+ )}
113
117
  <Body color="light">
114
118
  {`${city ? `${titleize(city)}, ` : ''}${uppercaseState}${zipcode ? ` ${zipcode}` : ''}`}
115
119
  </Body>
@@ -117,10 +121,14 @@ const HomeAddressStreet = (props: HomeAddressStreetProps): React.ReactElement =>
117
121
  }
118
122
  {emphasis == 'city' && !hasAllEmptyProps &&
119
123
  <div>
120
- <Body color="light">
121
- {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
122
- </Body>
123
- <Body color="light">{titleize(addressCont)}</Body>
124
+ {(address || houseStyle) && (
125
+ <Body color="light">
126
+ {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
127
+ </Body>
128
+ )}
129
+ {addressCont && (
130
+ <Body color="light">{titleize(addressCont)}</Body>
131
+ )}
124
132
  <div>
125
133
  <Title
126
134
  className="pb_home_address_street_address"
@@ -141,10 +149,14 @@ const HomeAddressStreet = (props: HomeAddressStreetProps): React.ReactElement =>
141
149
  }
142
150
  {emphasis == 'none' && !hasAllEmptyProps &&
143
151
  <div>
144
- <Body dark={dark}>
145
- {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
146
- </Body>
147
- <Body dark={dark}>{formatStreetAdr(addressCont)}</Body>
152
+ {(address || houseStyle) && (
153
+ <Body dark={dark}>
154
+ {joinPresent([formatStreetAdr(address), houseStyle], ' · ')}
155
+ </Body>
156
+ )}
157
+ {addressCont && (
158
+ <Body dark={dark}>{formatStreetAdr(addressCont)}</Body>
159
+ )}
148
160
  <div>
149
161
  <Body
150
162
  color="light"
@@ -1,15 +1,19 @@
1
- <%= pb_rails "body", props: {
2
- classname: "pb_home_address_street_address",
3
- color: "light",
4
- text: object.address_house_style,
5
- dark: object.dark
6
- } %>
7
- <%= pb_rails "body", props: {
8
- classname: "pb_home_address_street_address",
9
- color: "light",
10
- text: object.address_house_style2,
11
- dark: object.dark
12
- } %>
1
+ <% if object.address_house_style.present? %>
2
+ <%= pb_rails "body", props: {
3
+ classname: "pb_home_address_street_address",
4
+ color: "light",
5
+ text: object.address_house_style,
6
+ dark: object.dark
7
+ } %>
8
+ <% end %>
9
+ <% if object.address_house_style2.present? %>
10
+ <%= pb_rails "body", props: {
11
+ classname: "pb_home_address_street_address",
12
+ color: "light",
13
+ text: object.address_house_style2,
14
+ dark: object.dark
15
+ } %>
16
+ <% end %>
13
17
  <div>
14
18
  <%= pb_rails "title", props: {
15
19
  tag: "span",
@@ -8,4 +8,4 @@
8
8
  state: "PA",
9
9
  zipcode: "19382",
10
10
  territory: "PHL",
11
- }) %>
11
+ }) %>
@@ -1,15 +1,19 @@
1
- <%= pb_rails "body", props: {
2
- classname: "pb_home_address_street_address",
3
- size: 4,
4
- text: object.address_house_style,
5
- dark: object.dark
6
- } %>
7
- <%= pb_rails "body", props: {
8
- classname: "pb_home_address_street_address",
9
- size: 4,
10
- text: object.address_house_style2,
11
- dark: object.dark
12
- } %>
1
+ <% if object.address_house_style.present? %>
2
+ <%= pb_rails "body", props: {
3
+ classname: "pb_home_address_street_address",
4
+ size: 4,
5
+ text: object.address_house_style,
6
+ dark: object.dark
7
+ } %>
8
+ <% end %>
9
+ <% if object.address_house_style2.present? %>
10
+ <%= pb_rails "body", props: {
11
+ classname: "pb_home_address_street_address",
12
+ size: 4,
13
+ text: object.address_house_style2,
14
+ dark: object.dark
15
+ } %>
16
+ <% end %>
13
17
  <%= pb_rails "body", props: {
14
18
  color: "light",
15
19
  text: object.city_state_zip,
@@ -1,15 +1,19 @@
1
- <%= pb_rails "title", props: {
2
- classname: "pb_home_address_street_address",
3
- size: 4,
4
- text: object.address_house_style,
5
- dark: object.dark
6
- } %>
7
- <%= pb_rails "title", props: {
8
- classname: "pb_home_address_street_address",
9
- size: 4,
10
- text: object.address_house_style2,
11
- dark: object.dark
12
- } %>
1
+ <% if object.address_house_style.present? %>
2
+ <%= pb_rails "title", props: {
3
+ classname: "pb_home_address_street_address",
4
+ size: 4,
5
+ text: object.address_house_style,
6
+ dark: object.dark
7
+ } %>
8
+ <% end %>
9
+ <% if object.address_house_style2.present? %>
10
+ <%= pb_rails "title", props: {
11
+ classname: "pb_home_address_street_address",
12
+ size: 4,
13
+ text: object.address_house_style2,
14
+ dark: object.dark
15
+ } %>
16
+ <% end %>
13
17
  <%= pb_rails "body", props: {
14
18
  color: "light",
15
19
  text: object.city_state_zip,
@@ -36,6 +36,16 @@ $pb_multiple_users_size_xxs: map-get($avatar-sizes, "xxs");
36
36
  height: $pb_multiple_users_size_xxs;
37
37
  }
38
38
 
39
+
40
+ .user_tooltip {
41
+ margin-left: $pb_multiple_users_overlap !important;
42
+ }
43
+
44
+ .user_count_tooltip {
45
+ margin-left: $pb_multiple_users_overlap !important;
46
+ position: relative;
47
+ }
48
+
39
49
  .pb_multiple_users_item {
40
50
  margin-left: $pb_multiple_users_overlap;
41
51
  margin-right: 0;
@@ -5,17 +5,19 @@ import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../uti
5
5
  import { globalProps } from '../utilities/globalProps'
6
6
 
7
7
  import Avatar from '../pb_avatar/_avatar'
8
+ import Tooltip from '../pb_tooltip/_tooltip'
8
9
 
9
10
  type MultipleUsersProps = {
10
11
  aria?: { [key: string]: string },
11
12
  className?: string,
12
13
  dark?: boolean,
13
14
  data?: { [key: string]: string },
14
- htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
15
+ htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
15
16
  id?: string,
16
17
  maxDisplayedUsers?: number,
17
18
  reverse?: boolean,
18
19
  size?: "md" | "lg" | "sm" | "xl" | "xs" | "xxs",
20
+ withTooltip?: boolean,
19
21
  users: Array<{ [key: string]: string }>,
20
22
  }
21
23
 
@@ -30,6 +32,7 @@ const MultipleUsers = (props: MultipleUsersProps): React.ReactElement => {
30
32
  maxDisplayedUsers = 4,
31
33
  reverse = false,
32
34
  size = 'xs',
35
+ withTooltip = false,
33
36
  users,
34
37
  } = props
35
38
 
@@ -62,22 +65,70 @@ const MultipleUsers = (props: MultipleUsersProps): React.ReactElement => {
62
65
  className={classes}
63
66
  id={id}
64
67
  >
65
- {usersToDisplay.map((avatarData, index) => (
66
- <Avatar
67
- {...avatarData}
68
- className="pb_multiple_users_item"
69
- dark={dark}
70
- imageAlt={avatarData.name}
71
- key={index}
72
- size={size}
73
- />
74
- ))}
68
+ {withTooltip ?
69
+ <>
70
+ {usersToDisplay.map((avatarData, index) => (
71
+ <Tooltip
72
+ key={"user_tooltip_" + index}
73
+ placement='top'
74
+ text={avatarData.tooltip ? avatarData.tooltip : ''}
75
+ zIndex={10}
76
+ >
77
+ <Avatar
78
+ {...avatarData}
79
+ className={"pb_multiple_users_item" + (withTooltip ? " user_tooltip" : "")}
80
+ dark={dark}
81
+ imageAlt={avatarData.name}
82
+ key={index}
83
+ size={size}
84
+ />
85
+ </Tooltip>
86
+ ))}
75
87
 
76
- { users.length > maxDisplayedUsers &&
77
- <div className={itemClasses}>
78
- {`+${users.length - 3}`}
79
- </div>
88
+ {users.length > maxDisplayedUsers &&
89
+ <Tooltip
90
+ placement='top'
91
+ text={
92
+ <div>
93
+ {
94
+ usersToDisplay.length < users.length ?
95
+ users.slice(displayCount).map((u, i) => (
96
+ <div key={i}>{u.tooltip}</div>
97
+ ))
98
+ :
99
+ ''
100
+ }
101
+ </div>
102
+ }
103
+ zIndex={10}
104
+ >
105
+ <div className={itemClasses + (withTooltip ? " user_count_tooltip" : "")}>
106
+ {`+${users.length - displayCount}`}
107
+ </div>
108
+ </Tooltip>
109
+ }
110
+ </>
111
+ :
112
+ <>
113
+ {usersToDisplay.map((avatarData, index) => (
114
+ <Avatar
115
+ {...avatarData}
116
+ className="pb_multiple_users_item"
117
+ dark={dark}
118
+ imageAlt={avatarData.name}
119
+ key={index}
120
+ size={size}
121
+ />
122
+ ))}
123
+
124
+ {users.length > maxDisplayedUsers &&
125
+ <div className={itemClasses}>
126
+ {`+${users.length - 3}`}
127
+ </div>
128
+ }
129
+ </>
80
130
  }
131
+
81
132
  </div>
82
133
  )
83
134
  }
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+ import MultipleUsers from '../../pb_multiple_users/_multiple_users'
3
+
4
+ const MultipleUsersWithTooltip = (props) => {
5
+ return (
6
+ <div>
7
+ <MultipleUsers
8
+ users={[
9
+ {
10
+ name: 'Patrick Welch',
11
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
12
+ tooltip: "Patrick Welch - Online"
13
+ },
14
+ {
15
+ name: 'Lucille Sanchez',
16
+ imageUrl: 'https://randomuser.me/api/portraits/women/6.jpg',
17
+ tooltip: "Lucille Sanchez - Offline"
18
+ },
19
+ {
20
+ name: 'Beverly Reyes',
21
+ imageUrl: 'https://randomuser.me/api/portraits/women/74.jpg',
22
+ tooltip: "Beverly Reyes - Online"
23
+ },
24
+ {
25
+ name: 'Keith Craig',
26
+ imageUrl: 'https://randomuser.me/api/portraits/men/40.jpg',
27
+ tooltip: "Keith Craig - Away"
28
+ },
29
+ {
30
+ name: 'Alicia Cooper',
31
+ imageUrl: 'https://randomuser.me/api/portraits/women/46.jpg',
32
+ tooltip: "Alicia Cooper - Busy"
33
+ },
34
+ ]}
35
+ withTooltip
36
+ {...props}
37
+ />
38
+ </div>
39
+ )
40
+ }
41
+ ``
42
+ export default MultipleUsersWithTooltip
@@ -0,0 +1 @@
1
+ Use the `withTooltip` boolean prop to enable setting user-specific tooltip content via the `tooltip` property in the users array.
@@ -10,6 +10,7 @@ examples:
10
10
  - multiple_users_default: Default
11
11
  - multiple_users_reverse: Reverse
12
12
  - multiple_users_size: Size
13
+ - multiple_users_with_tooltip: With Tooltip
13
14
 
14
15
  swift:
15
16
  - multiple_users_default_swift: Default
@@ -1,3 +1,4 @@
1
1
  export { default as MultipleUsersDefault } from './_multiple_users_default.jsx'
2
2
  export { default as MultipleUsersReverse } from './_multiple_users_reverse.jsx'
3
3
  export { default as MultipleUsersSize } from './_multiple_users_size.jsx'
4
+ export { default as MultipleUsersWithTooltip } from './_multiple_users_with_tooltip.jsx'
@@ -49,4 +49,29 @@ test('should render aria-label', () => {
49
49
 
50
50
  const kit = screen.getByTestId(testId)
51
51
  expect(kit).toHaveAttribute('aria-label', testId)
52
+ })
53
+
54
+ test('should render withTooltip prop', () => {
55
+ render(
56
+ <MultipleUsers
57
+ data={{ testid: testId }}
58
+ users={[
59
+ {
60
+ name: 'Patrick Welch',
61
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
62
+ tooltip: "Patrick Welch - Online"
63
+ },
64
+ {
65
+ name: 'Lucille Sanchez',
66
+ imageUrl: 'https://randomuser.me/api/portraits/women/6.jpg',
67
+ tooltip: "Lucille Sanchez - Offline"
68
+ },
69
+ ]}
70
+ withTooltip
71
+ />
72
+ )
73
+
74
+ const kit = screen.getByTestId(testId)
75
+ const childWithTooltip = kit.querySelector('.pb_tooltip_kit')
76
+ expect(childWithTooltip).not.toBeNull()
52
77
  })