playbook_ui 14.5.0.pre.alpha.PLAY1548intltelinputupdatelatest4073 → 14.5.0.pre.alpha.PLAY1548intltelinputupdatelatest4162

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +20 -4
  3. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.jsx +45 -0
  4. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.md +1 -0
  5. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +1 -0
  6. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -0
  7. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +1 -1
  8. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +2 -2
  9. data/app/pb_kits/playbook/pb_filter/Filter/ResultsCount.tsx +4 -2
  10. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.jsx +1 -1
  11. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +17 -0
  12. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +93 -0
  13. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.md +1 -0
  14. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +1 -0
  15. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +169 -65
  16. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.test.js +5 -5
  17. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +15 -9
  18. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_size.html.erb +336 -0
  19. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_size.jsx +97 -0
  20. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/example.yml +2 -0
  21. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/index.js +1 -0
  22. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +28 -6
  23. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.rb +31 -1
  24. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +15 -8
  25. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +2 -1
  26. data/dist/chunks/{_typeahead-CY44rh9x.js → _typeahead-ICFw7Umq.js} +1 -1
  27. data/dist/chunks/_weekday_stacked-CDe9cyw6.js +45 -0
  28. data/dist/chunks/vendor.js +1 -1
  29. data/dist/playbook-doc.js +1 -1
  30. data/dist/playbook-rails-react-bindings.js +1 -1
  31. data/dist/playbook-rails.js +1 -1
  32. data/dist/playbook.css +1 -1
  33. data/lib/playbook/version.rb +1 -1
  34. metadata +10 -4
  35. data/dist/chunks/_weekday_stacked-NcRanohJ.js +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e66c8286d8ecf72cb72ba05016e62b9af7853a17eb794b6f63850def5343fbc
4
- data.tar.gz: f4c96694caf2db55ee62b603903ec1fbfa0a3e4b8deb3bf00debf687ddf98d35
3
+ metadata.gz: f54238916554d7fc5db336d5fd9f600012d2d3451b1232364a9a6f70276f6241
4
+ data.tar.gz: 2081782f7da94b64103e5a4beeb61a34c3fd1d3c9e4d99979388d4042ec5edae
5
5
  SHA512:
6
- metadata.gz: 4cfebc74a346cb2395a08063f54683f6ba50e4f7818112db223af3bc9d365c4c09d451201d0d0d6a2d0b314f575b819e18b2a343c7aa1d838c779691338fc27a
7
- data.tar.gz: c7f938931e124a2063f3a86b1d137f75c7bd55aef89ad8069fbf48b9f07069430091958d8bed3f9694e74f810cc2196f8d49257512e03473556f9ac3f0e4e4f5
6
+ metadata.gz: c6fffc6c90ba549db56e62d9db74f412ad6d86a52b6ff9dfd1329c33a385226086d547cdbc046555c908cb408c2d262c33b541c63d4e3193bc961bed58475c72
7
+ data.tar.gz: 2e8ffc641e46dd560aeb456042d3f437a152e4341836f2d5ffdf87872264663076c1d0d4f6d8e30ebe80f346aca768764cbb5d57b4280137a63a9b182d5ca019
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect } from "react";
1
+ import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
2
2
  import classnames from "classnames";
3
3
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
4
4
  import { globalProps } from "../utilities/globalProps";
@@ -38,7 +38,14 @@ type DropdownProps = {
38
38
  triggerRef?: any;
39
39
  };
40
40
 
41
- const Dropdown = (props: DropdownProps) => {
41
+ interface DropdownComponent
42
+ extends React.ForwardRefExoticComponent<DropdownProps & React.RefAttributes<unknown>> {
43
+ Option: typeof DropdownOption;
44
+ Trigger: typeof DropdownTrigger;
45
+ Container: typeof DropdownContainer;
46
+ }
47
+
48
+ const Dropdown = forwardRef((props: DropdownProps, ref: any) => {
42
49
  const {
43
50
  aria = {},
44
51
  autocomplete = false,
@@ -125,7 +132,7 @@ const Dropdown = (props: DropdownProps) => {
125
132
  const filteredOptions = optionsWithBlankSelection?.filter((option: GenericObject) => {
126
133
  const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
127
134
  return String(label).toLowerCase().includes(filterItem.toLowerCase());
128
- });
135
+ });
129
136
 
130
137
  // For keyboard accessibility: Set focus within dropdown to selected item if it exists
131
138
  useEffect(() => {
@@ -175,6 +182,14 @@ const Dropdown = (props: DropdownProps) => {
175
182
  dark
176
183
  });
177
184
 
185
+ useImperativeHandle(ref, () => ({
186
+ clearSelected: () => {
187
+ setSelected({});
188
+ setFilterItem("");
189
+ setIsDropDownClosed(true);
190
+ onSelect && onSelect(null);
191
+ },
192
+ }));
178
193
 
179
194
  return (
180
195
  <div {...ariaProps}
@@ -258,8 +273,9 @@ const Dropdown = (props: DropdownProps) => {
258
273
  </DropdownContext.Provider>
259
274
  </div>
260
275
  )
261
- };
276
+ }) as DropdownComponent
262
277
 
278
+ Dropdown.displayName = "Dropdown";
263
279
  Dropdown.Option = DropdownOption;
264
280
  Dropdown.Trigger = DropdownTrigger;
265
281
  Dropdown.Container = DropdownContainer;
@@ -0,0 +1,45 @@
1
+ import React, { useRef } from 'react'
2
+ import { Button, Dropdown } from 'playbook-ui'
3
+
4
+ const options = [
5
+ {
6
+ label: "United States",
7
+ value: "United States",
8
+ },
9
+ {
10
+ label: "Canada",
11
+ value: "Canada",
12
+ },
13
+ {
14
+ label: "Pakistan",
15
+ value: "Pakistan",
16
+ }
17
+ ]
18
+
19
+ const DropdownClearSelection = (props) => {
20
+ const dropdownRef = useRef(null)
21
+
22
+ const handleReset = () => {
23
+ if (dropdownRef.current) {
24
+ dropdownRef.current.clearSelected()
25
+ }
26
+ }
27
+
28
+ return (
29
+ <>
30
+ <Dropdown
31
+ defaultValue={options[2]}
32
+ options={options}
33
+ ref={dropdownRef}
34
+ {...props}
35
+ />
36
+ <Button
37
+ marginTop="md"
38
+ onClick={handleReset}
39
+ text="Reset"
40
+ />
41
+ </>
42
+ )
43
+ }
44
+
45
+ export default DropdownClearSelection
@@ -0,0 +1 @@
1
+ To use an external control (like a reset button) to clear Dropdown selection, you can make use of the `useRef` hook. You must pass a ref to the Dropdown component and use that ref within the onClick for the external control in the way shown in the code snippet below.
@@ -22,6 +22,7 @@ examples:
22
22
  - dropdown_error: Dropdown with Error
23
23
  - dropdown_default_value: Default Value
24
24
  - dropdown_blank_selection: Blank Selection
25
+ - dropdown_clear_selection: Clear Selection
25
26
  # - dropdown_with_autocomplete: Autocomplete
26
27
  # - dropdown_with_autocomplete_and_custom_display: Autocomplete with Custom Display
27
28
  # - dropdown_with_external_control: useDropdown Hook
@@ -12,3 +12,4 @@ export { default as DropdownSubcomponentStructure } from './_dropdown_subcompone
12
12
  export { default as DropdownError } from './_dropdown_error.jsx'
13
13
  export { default as DropdownDefaultValue } from './_dropdown_default_value.jsx'
14
14
  export { default as DropdownBlankSelection } from './_dropdown_blank_selection.jsx'
15
+ export { default as DropdownClearSelection } from './_dropdown_clear_selection.jsx'
@@ -62,7 +62,7 @@ const DropdownOption = (props: DropdownOptionProps) => {
62
62
  const focusedClass = isFocused && "focused";
63
63
 
64
64
  const selectedClass = `${
65
- selected.label === option.label
65
+ selected?.label === option.label
66
66
  ? "selected"
67
67
  : "list"
68
68
  }`;
@@ -73,7 +73,7 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
73
73
  !autocomplete && "select_only"
74
74
  );
75
75
 
76
- const customDisplayPlaceholder = selected.label ? (
76
+ const customDisplayPlaceholder = selected?.label ? (
77
77
  <b>{selected.label}</b>
78
78
  ) : autocomplete ? (
79
79
  ""
@@ -83,7 +83,7 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
83
83
  "Select..."
84
84
  );
85
85
 
86
- const defaultDisplayPlaceholder = selected.label
86
+ const defaultDisplayPlaceholder = selected?.label
87
87
  ? selected.label
88
88
  : autocomplete
89
89
  ? ""
@@ -13,6 +13,7 @@ type ResultsCountProps = {
13
13
  const ResultsCount = ({ dark, results, title }: ResultsCountProps): React.ReactElement => {
14
14
 
15
15
  const resultTitle = () => {
16
+ if (results == null) return null
16
17
  return (
17
18
  <TitleCount
18
19
  align="center"
@@ -24,6 +25,7 @@ const ResultsCount = ({ dark, results, title }: ResultsCountProps): React.ReactE
24
25
  }
25
26
 
26
27
  const justResults = () => {
28
+ if (results == null) return null
27
29
  return (
28
30
  <Caption
29
31
  className="filter-results"
@@ -35,13 +37,13 @@ const ResultsCount = ({ dark, results, title }: ResultsCountProps): React.ReactE
35
37
  }
36
38
 
37
39
  const displayResultsCount = () => {
38
- if (results && title) {
40
+ if (results != null && results >=0 && title) {
39
41
  return (
40
42
  <>
41
43
  {resultTitle()}
42
44
  </>
43
45
  )
44
- } else if (results) {
46
+ } else if (results !=null && results >=0 ) {
45
47
  return (
46
48
  <>
47
49
  {justResults()}
@@ -78,7 +78,7 @@ const FilterDefault = (props) => {
78
78
  double
79
79
  minWidth="375px"
80
80
  onSortChange={SortingChangeCallback}
81
- results={1}
81
+ results={0}
82
82
  sortOptions={{
83
83
  popularity: 'Popularity',
84
84
  // eslint-disable-next-line
@@ -202,6 +202,23 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
202
202
  };
203
203
  }, []);
204
204
 
205
+ useEffect(() => {
206
+ if (id) {
207
+ // Attach the clear function to the window, scoped by the id
208
+ (window as any)[`clearMultiLevelSelect_${id}`] = () => {
209
+ const resetData = modifyRecursive(formattedData, false);
210
+ setFormattedData(resetData);
211
+ setReturnedArray([]);
212
+ setDefaultReturn([]);
213
+ setSingleSelectedItem({ id: [], value: "", item: [] });
214
+ onSelect([]);
215
+ };
216
+ return () => {
217
+ delete (window as any)[`clearMultiLevelSelect_${id}`];
218
+ };
219
+ }
220
+ }, [formattedData, id, onSelect]);
221
+
205
222
  // Iterate over tree, find item and set checked or unchecked
206
223
  const modifyValue = (
207
224
  id: string,
@@ -0,0 +1,93 @@
1
+ <% treeData = [{
2
+ label: "Power Home Remodeling",
3
+ value: "Power Home Remodeling",
4
+ id: "100",
5
+ expanded: true,
6
+ children: [
7
+ {
8
+ label: "People",
9
+ value: "People",
10
+ id: "101",
11
+ expanded: true,
12
+ children: [
13
+ {
14
+ label: "Talent Acquisition",
15
+ value: "Talent Acquisition",
16
+ id: "102",
17
+ },
18
+ {
19
+ label: "Business Affairs",
20
+ value: "Business Affairs",
21
+ id: "103",
22
+ children: [
23
+ {
24
+ label: "Initiatives",
25
+ value: "Initiatives",
26
+ id: "104",
27
+ },
28
+ {
29
+ label: "Learning & Development",
30
+ value: "Learning & Development",
31
+ id: "105",
32
+ },
33
+ ],
34
+ },
35
+ {
36
+ label: "People Experience",
37
+ value: "People Experience",
38
+ id: "106",
39
+ },
40
+ ],
41
+ },
42
+ {
43
+ label: "Contact Center",
44
+ value: "Contact Center",
45
+ id: "107",
46
+ children: [
47
+ {
48
+ label: "Appointment Management",
49
+ value: "Appointment Management",
50
+ id: "108",
51
+ },
52
+ {
53
+ label: "Customer Service",
54
+ value: "Customer Service",
55
+ id: "109",
56
+ },
57
+ {
58
+ label: "Energy",
59
+ value: "Energy",
60
+ id: "110",
61
+ },
62
+ ],
63
+ },
64
+ ],
65
+ }] %>
66
+
67
+ <%= pb_rails("multi_level_select", props: {
68
+ id: "multi-level-select-reset-example",
69
+ name: "my_array",
70
+ tree_data: treeData,
71
+ return_all_selected: true
72
+ }) %>
73
+
74
+ <%= pb_rails("button", props: { text: "Reset", margin_top: "lg", id:"multilevelselect-reset-button" }) %>
75
+
76
+
77
+ <script>
78
+ window.addEventListener('DOMContentLoaded', () => {
79
+ const exampleResetButton = document.querySelector("#multilevelselect-reset-button");
80
+
81
+ exampleResetButton.addEventListener("click", () => {
82
+ clearMultiLevelSelectById('multi-level-select-reset-example');
83
+ });
84
+ function clearMultiLevelSelectById(id) {
85
+ const clearFunction = window[`clearMultiLevelSelect_${id}`];
86
+ if (clearFunction) {
87
+ clearFunction();
88
+ } else {
89
+ console.warn(`No clear function found for MultiLevelSelect with id: ${id}`);
90
+ }
91
+ }
92
+ })
93
+ </script>
@@ -0,0 +1 @@
1
+ In order to clear the multilevelselect selection using an external trigger (like a reset button), the `clearMultiLevelSelect` function can be used. See the code snippet below to see this in action. The function is scoped by id so an id MUST be used on the multilevelselect kit and passed to the function as shown for it to work.
@@ -7,6 +7,7 @@ examples:
7
7
  - multi_level_select_selected_ids: Selected Ids
8
8
  - multi_level_select_with_form: With Form
9
9
  - multi_level_select_color: With Pills (Custom Color)
10
+ - multi_level_select_reset: Reset Selection
10
11
 
11
12
  react:
12
13
  - multi_level_select_default: Default
@@ -3,6 +3,76 @@
3
3
  @import "../tokens/opacity";
4
4
  @import "../pb_avatar/avatar";
5
5
 
6
+ $sizes: (
7
+ "avatar": ("sm": 38px, "md": 60px, "lg": 80px, "xl": 100px),
8
+ "first-item-double": ("sm": 20px, "md": 32px, "lg": 44px, "xl": 56px),
9
+ "first-item-triple": ("sm": 16px, "md": 24px, "lg": 32px, "xl": 44px),
10
+ "first-item-quadruple": ("sm": 16px, "md": 28px, "lg": 36px, "xl": 44px),
11
+ "second-item-double": ("sm": 12px, "md": 16px, "lg": 20px, "xl": 24px),
12
+ "second-item-triple": ("sm": 12px, "md": 20px, "lg": 24px, "xl": 32px),
13
+ "second-item-quadruple": ("sm": 12px, "md": 20px, "lg": 28px, "xl": 32px),
14
+ "third-item-triple": ("sm": 10px, "md": 16px, "lg": 20px, "xl": 24px),
15
+ "third-item-quadruple": ("sm": 10px, "md": 16px, "lg": 24px, "xl": 24px),
16
+ "fourth-item": ("sm": 8px, "md": 12px, "lg": 16px, "xl": 16px)
17
+ );
18
+
19
+ $positions: (
20
+ "second-item-double": (
21
+ "sm": ("top": null, "bottom": 5px, "right": 4px, "left": null),
22
+ "md": ("top": null, "bottom": 10px, "right": 8px, "left": null),
23
+ "lg": ("top": 46px, "bottom": null, "right": 12px, "left": null),
24
+ "xl": ("top": 58px, "bottom": null, "right": 14px, "left": null)
25
+ ),
26
+ "second-item-triple": (
27
+ "sm": ("top": 12px, "bottom": null, "right": 2px, "left": null),
28
+ "md": ("top": 24px, "bottom": null, "right": 5px, "left": null),
29
+ "lg": ("top": 32px, "bottom": null, "right": 9px, "left": null),
30
+ "xl": ("top": 41px, "bottom": null, "right": 11px, "left": null)
31
+ ),
32
+ "second-item-quadruple": (
33
+ "sm": ("top": null, "bottom": 9px, "right": 4px, "left": null),
34
+ "md": ("top": 24px, "bottom": null, "right": 5px, "left": null),
35
+ "lg": ("top": 31px, "bottom": null, "right": 6px, "left": null),
36
+ "xl": ("top": 43px, "bottom": null, "right": 9px, "left": null)
37
+ ),
38
+ "third-item-triple": (
39
+ "sm": ("top": null, "bottom": 3px, "right": null, "left": 11px),
40
+ "md": ("top": null, "bottom": 6px, "right": null, "left": 16px),
41
+ "lg": ("top": null, "bottom": 10px, "right": null, "left": 23px),
42
+ "xl": ("top": null, "bottom": 13px, "right": null, "left": 27px)
43
+ ),
44
+ "third-item-quadruple": (
45
+ "sm": ("top": null, "bottom": 3px, "right": null, "left": 9px),
46
+ "md": ("top": null, "bottom": 5px, "right": null, "left": 15px),
47
+ "lg": ("top": null, "bottom": 7px, "right": null, "left": 20px),
48
+ "xl": ("top": null, "bottom": 11px, "right": null, "left": 27px)
49
+ ),
50
+ "fourth-item": (
51
+ "sm": ("top": 5px, "bottom": null, "right": 6px, "left": null),
52
+ "md": ("top": 7px, "bottom": null, "right": 12px, "left": null),
53
+ "lg": ("top": 9px, "bottom": null, "right": 16px, "left": null),
54
+ "xl": ("top": 16px, "bottom": null, "right": 24px, "left": null)
55
+ ),
56
+ "first-item-double": (
57
+ "sm": ("top": 4px, "bottom": null, "right": null, "left": 3px),
58
+ "md": ("top": 6px, "bottom": null, "right": null, "left": 8px),
59
+ "lg": ("top": 8px, "bottom": null, "right": null, "left": 8px),
60
+ "xl": ("top": 10px, "bottom": null, "right": null, "left": 10px)
61
+ ),
62
+ "first-item-triple": (
63
+ "sm": ("top": 4px, "bottom": null, "right": null, "left": 4px),
64
+ "md": ("top": 7px, "bottom": null, "right": null, "left": 7px),
65
+ "lg": ("top": 10px, "bottom": null, "right": null, "left": 10px),
66
+ "xl": ("top": 12px, "bottom": null, "right": null, "left": 12px)
67
+ ),
68
+ "first-item-quadruple": (
69
+ "sm": ("top": 5px, "bottom": null, "right": null, "left": 3px),
70
+ "md": ("top": 7px, "bottom": null, "right": null, "left": 5px),
71
+ "lg": ("top": 9px, "bottom": null, "right": null, "left": 7px),
72
+ "xl": ("top": 16px, "bottom": null, "right": null, "left": 10px)
73
+ )
74
+ );
75
+
6
76
  @mixin avatar-size($size) {
7
77
  height: $size;
8
78
  width: $size;
@@ -27,8 +97,8 @@
27
97
  $stacked_size: 18px;
28
98
  $max_to_display: 1, 2;
29
99
  display: inline-flex;
30
- width: $container_size;
31
- height: $container_size;
100
+ width: 28px;
101
+ height: 28px;
32
102
  flex-basis: $container_size;
33
103
  position: relative;
34
104
  flex-shrink: 0;
@@ -48,7 +118,7 @@
48
118
  }
49
119
  }
50
120
  &[class*=_single] .pb_multiple_users_stacked_item {
51
- @include avatar-size($container_size);
121
+ @include avatar-size(28px);
52
122
  }
53
123
  [class^=pb_avatar_kit].second_item, [class^=pb_badge_kit].second_item {
54
124
  @include position((bottom: 0, right: 0));
@@ -71,72 +141,106 @@
71
141
  color: transparent;
72
142
  }
73
143
 
74
- &[class*=_bubble] {
75
- @include avatar-size($bubble_container_size);
76
- background-color: $bg_light;
77
- border-radius: 50%;
78
-
79
- &.dark {
80
- background-color: $card_dark;
81
- }
82
-
83
- [class^=pb_avatar_kit].pb_multiple_users_stacked_item {
84
- &.dark {
85
- .avatar_wrapper {
86
- border: $border_size solid $border_dark;
87
- }
88
- }
89
- }
90
-
91
- [class^=pb_avatar_kit] {
92
- &.first_item {
93
- @include position((top: 4px, left: 3px));
94
- @include avatar-size(20px);
95
-
96
- &.triple_bubble {
97
- @include position((top: 4px, left: 4px));
98
- @include avatar-size(16px);
144
+ // Iterate over each size to adjust the bubble container only when class contains "_bubble_"
145
+ @each $size_name, $size_value in $avatar-sizes {
146
+ &[class*=_bubble_][class*=_size_#{$size_name}] {
147
+ // Set bubble container size based on the class
148
+ $bubble_container_size: $size_value;
149
+ $container_size: $size_value;
150
+
151
+ // Apply the bubble container size
152
+ @include avatar-size($bubble_container_size);
153
+ width: $bubble_container_size;
154
+ height: $bubble_container_size;
155
+ flex-basis: $bubble_container_size;
156
+
157
+ background-color: $bg_light;
158
+ border-radius: 50%;
159
+
160
+ &.dark {
161
+ background-color: $card_dark;
99
162
  }
100
-
101
- &.quadruple_bubble {
102
- @include position((top: 5px, left: 3px));
103
- @include avatar-size(16px);
104
- }
105
- }
106
-
107
- &.second_item {
108
- @include position((bottom: 5px, right: 4px));
109
- @include avatar-size(12px);
110
-
111
- &.triple_bubble {
112
- @include position((top: 13px, right: 2px));
163
+
164
+ [class^=pb_avatar_kit].pb_multiple_users_stacked_item {
165
+ @include avatar-size($bubble_container_size * 0.45); // Adjust the size of stacked avatars
166
+
167
+ &.dark {
168
+ .avatar_wrapper {
169
+ border: $border_size solid $border_dark;
170
+ }
171
+ }
172
+
173
+ .avatar_wrapper {
174
+ border: $border_size solid $white;
175
+ }
113
176
  }
114
-
115
- &.quadruple_bubble {
116
- @include position((bottom: 9px, right: 4px));
177
+
178
+ [class^=pb_avatar_kit] {
179
+ // First Item
180
+ &.first_item {
181
+ @include position(map-get(map-get($positions, 'first-item-double'), $size_name));
182
+ @include avatar-size(map-get(map-get($sizes, 'first-item-double'), $size_name));
183
+
184
+ &.double_bubble {
185
+ @include position(map-get(map-get($positions, 'first-item-double'), $size_name));
186
+ @include avatar-size(map-get(map-get($sizes, 'first-item-double'), $size_name));
187
+ }
188
+
189
+ &.triple_bubble {
190
+ @include position(map-get(map-get($positions, 'first-item-triple'), $size_name));
191
+ @include avatar-size(map-get(map-get($sizes, 'first-item-triple'), $size_name));
192
+ }
193
+
194
+ &.quadruple_bubble {
195
+ @include position(map-get(map-get($positions, 'first-item-quadruple'), $size_name));
196
+ @include avatar-size(map-get(map-get($sizes, 'first-item-quadruple'), $size_name));
197
+ }
198
+ }
199
+
200
+ // Second Item
201
+ &.second_item {
202
+ @include position(map-get(map-get($positions, 'second-item-double'), $size_name));
203
+
204
+ &.double_bubble {
205
+ @include position(map-get(map-get($positions, 'second-item-double'), $size_name));
206
+ @include avatar-size(map-get(map-get($sizes, 'second-item-double'), $size_name));
207
+ }
208
+
209
+ &.triple_bubble {
210
+ @include position(map-get(map-get($positions, 'second-item-triple'), $size_name));
211
+ @include avatar-size(map-get(map-get($sizes, 'second-item-triple'), $size_name));
212
+ }
213
+
214
+ &.quadruple_bubble {
215
+ @include position(map-get(map-get($positions, 'second-item-quadruple'), $size_name));
216
+ @include avatar-size(map-get(map-get($sizes, 'second-item-quadruple'), $size_name));
217
+ }
218
+ }
219
+
220
+ // Third Item
221
+ &.third_item {
222
+ @include position(map-get(map-get($positions, 'third-item-triple'), $size_name));
223
+ @include avatar-size(map-get(map-get($sizes, 'third-item-triple'), $size_name));
224
+
225
+ &.quadruple_bubble {
226
+ @include position(map-get(map-get($positions, 'third-item-quadruple'), $size_name));
227
+ @include avatar-size(map-get(map-get($sizes, 'third-item-quadruple'), $size_name));
228
+ }
229
+ }
230
+
231
+ // Fourth Item
232
+ &.fourth_item {
233
+ @include position(map-get(map-get($positions, 'fourth-item'), $size_name));
234
+ @include avatar-size(map-get(map-get($sizes, 'fourth-item'), $size_name));
235
+ }
117
236
  }
118
- }
119
-
120
- &.third_item {
121
- @include position((bottom: 3px, left: 11px));
122
- @include avatar-size(10px);
123
-
124
- &.quadruple_bubble {
125
- @include position((bottom: 3px, left: 9px));
237
+
238
+ &[class*=_single_bubble] {
239
+ [class^=pb_avatar_kit].first_item {
240
+ @include position((top: 0, left: 0));
241
+ @include avatar-size($bubble_container_size);
242
+ }
126
243
  }
127
244
  }
128
-
129
- &.fourth_item {
130
- @include position((top: 5px, right: 6px));
131
- @include avatar-size(8px);
132
- }
133
- }
134
- }
135
-
136
- &[class*=_single_bubble] {
137
- [class^=pb_avatar_kit].first_item {
138
- @include position((top: 0, left: 0));
139
- @include avatar-size($bubble_container_size);
140
245
  }
141
246
  }
142
- }
@@ -81,7 +81,7 @@ const MultipleUsersStackedSingleBubble = () => {
81
81
  test('should have a single bubble', () => {
82
82
  render(<MultipleUsersStackedSingleBubble />)
83
83
  const kit = screen.getByTestId(testId)
84
- expect(kit).toHaveClass("pb_multiple_users_stacked_kit_single_bubble")
84
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_single_bubble_size_sm")
85
85
 
86
86
  const firstItem = kit.querySelector('.first_item');
87
87
  expect(firstItem).toBeInTheDocument();
@@ -113,7 +113,7 @@ const MultipleUsersStackedDoubleBubble = () => {
113
113
  test('should have a double bubble', () => {
114
114
  render(<MultipleUsersStackedDoubleBubble />)
115
115
  const kit = screen.getByTestId(testId)
116
- expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
116
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble_size_sm")
117
117
 
118
118
  const firstItem = kit.querySelector('.first_item');
119
119
  expect(firstItem).toBeInTheDocument();
@@ -153,7 +153,7 @@ const MultipleUsersStackedTripleBubble = () => {
153
153
  test('should have a triple bubble', () => {
154
154
  render(<MultipleUsersStackedTripleBubble />)
155
155
  const kit = screen.getByTestId(testId)
156
- expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
156
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble_size_sm")
157
157
 
158
158
  const firstItem = kit.querySelector('.first_item');
159
159
  expect(firstItem).toBeInTheDocument();
@@ -208,7 +208,7 @@ const MultipleUsersStackedQuadrupleBubble = () => {
208
208
  test('should have a quadruple bubble', () => {
209
209
  render(<MultipleUsersStackedQuadrupleBubble />)
210
210
  const kit = screen.getByTestId(testId)
211
- expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
211
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble_size_sm")
212
212
 
213
213
  const firstItem = kit.querySelector('.first_item');
214
214
  expect(firstItem).toBeInTheDocument();
@@ -224,4 +224,4 @@ test('should have a quadruple bubble', () => {
224
224
 
225
225
  const fourthItem = kit.querySelector('.fourth_item');
226
226
  expect(fourthItem).toBeInTheDocument();
227
- })
227
+ })