playbook_ui 14.3.2 → 14.4.0.pre.alpha.PBNTR550typeaheadformpilltruncate3895

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/SortIconButton.tsx +23 -4
  3. data/app/pb_kits/playbook/pb_contact/_contact.tsx +17 -5
  4. data/app/pb_kits/playbook/pb_contact/contact.html.erb +14 -6
  5. data/app/pb_kits/playbook/pb_contact/contact.rb +4 -0
  6. data/app/pb_kits/playbook/pb_contact/contact.test.js +1 -1
  7. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +4 -3
  8. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +1 -1
  9. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +4 -0
  10. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +6 -3
  11. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +1 -1
  12. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +2 -3
  13. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_header_styles.scss +6 -2
  14. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +2 -0
  15. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +1 -1
  16. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +245 -23
  17. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +10 -2
  18. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.html.erb +117 -0
  19. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.jsx +227 -0
  20. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.md +1 -0
  21. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  22. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  23. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +1 -1
  24. data/app/pb_kits/playbook/pb_icon/icon.rb +1 -1
  25. data/app/pb_kits/playbook/pb_map/_map_controls.tsx +7 -1
  26. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +20 -5
  27. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +72 -0
  28. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +91 -0
  29. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_rails.md +1 -0
  30. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_react.md +1 -0
  31. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  32. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  33. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +4 -0
  34. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +97 -21
  35. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.test.js +166 -0
  36. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +45 -6
  37. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.html.erb +73 -0
  38. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.jsx +86 -0
  39. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/example.yml +2 -0
  40. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/index.js +1 -0
  41. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +6 -2
  42. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.rb +21 -1
  43. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change.jsx +12 -1
  44. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change_react.md +3 -1
  45. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +10 -2
  46. data/app/pb_kits/playbook/pb_radio/_radio.tsx +92 -33
  47. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.html.erb +48 -0
  48. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +59 -0
  49. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.md +1 -0
  50. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -0
  51. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  52. data/app/pb_kits/playbook/pb_radio/index.js +17 -0
  53. data/app/pb_kits/playbook/pb_radio/radio.html.erb +35 -13
  54. data/app/pb_kits/playbook/pb_radio/radio.rb +3 -1
  55. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarDropdown.tsx +12 -5
  56. data/app/pb_kits/playbook/pb_select/_select.tsx +5 -2
  57. data/app/pb_kits/playbook/pb_select/select.html.erb +1 -1
  58. data/app/pb_kits/playbook/pb_select/select.rb +4 -0
  59. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +0 -1
  60. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +0 -1
  61. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +30 -0
  62. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +11 -1
  63. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +6 -5
  64. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +28 -18
  65. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.html.erb +88 -0
  66. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.jsx +60 -0
  67. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +31 -0
  68. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +26 -0
  69. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_rails.md +1 -0
  70. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_react.md +1 -0
  71. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +4 -0
  72. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +2 -0
  73. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +2 -1
  74. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +10 -1
  75. data/app/pb_kits/playbook/tokens/_colors.scss +2 -0
  76. data/app/pb_kits/playbook/utilities/icons/allicons.tsx +123 -0
  77. data/app/pb_kits/playbook/utilities/icons/angle-down.svg +3 -0
  78. data/app/pb_kits/playbook/utilities/icons/envelope.svg +3 -0
  79. data/dist/chunks/_typeahead-Ctc4yCCN.js +22 -0
  80. data/dist/chunks/_weekday_stacked-B4Xs5p_U.js +45 -0
  81. data/dist/chunks/lib-CEpcaI8y.js +29 -0
  82. data/dist/chunks/{pb_form_validation-u2wnZ3oe.js → pb_form_validation-D9zkwt2b.js} +1 -1
  83. data/dist/chunks/vendor.js +1 -1
  84. data/dist/playbook-doc.js +1 -1
  85. data/dist/playbook-rails-react-bindings.js +1 -1
  86. data/dist/playbook-rails.js +1 -1
  87. data/dist/playbook.css +1 -1
  88. data/lib/playbook/version.rb +2 -2
  89. metadata +30 -9
  90. data/dist/chunks/_typeahead-DbAz2Okr.js +0 -22
  91. data/dist/chunks/_weekday_stacked-CZ5S17_d.js +0 -45
  92. data/dist/chunks/lib-D9uVVKnh.js +0 -16
@@ -0,0 +1,91 @@
1
+ import React from "react";
2
+ import MultiLevelSelect from "../_multi_level_select";
3
+
4
+ const treeData = [
5
+ {
6
+ label: "Power Home Remodeling",
7
+ value: "Power Home Remodeling",
8
+ id: "powerhome1",
9
+ expanded: true,
10
+ children: [
11
+ {
12
+ label: "People",
13
+ value: "People",
14
+ id: "people1",
15
+ expanded: true,
16
+ children: [
17
+ {
18
+ label: "Talent Acquisition",
19
+ value: "Talent Acquisition",
20
+ id: "talent1",
21
+ },
22
+ {
23
+ label: "Business Affairs",
24
+ value: "Business Affairs",
25
+ id: "business1",
26
+ children: [
27
+ {
28
+ label: "Initiatives",
29
+ value: "Initiatives",
30
+ id: "initiative1",
31
+ },
32
+ {
33
+ label: "Learning & Development",
34
+ value: "Learning & Development",
35
+ id: "development1",
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ label: "People Experience",
41
+ value: "People Experience",
42
+ id: "experience1",
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ label: "Contact Center",
48
+ value: "Contact Center",
49
+ id: "contact1",
50
+ children: [
51
+ {
52
+ label: "Appointment Management",
53
+ value: "Appointment Management",
54
+ id: "appointment1",
55
+ },
56
+ {
57
+ label: "Customer Service",
58
+ value: "Customer Service",
59
+ id: "customer1",
60
+ },
61
+ {
62
+ label: "Energy",
63
+ value: "Energy",
64
+ id: "energy1",
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ ];
71
+
72
+ const MultiLevelSelectColor = (props) => {
73
+ return (
74
+ <div>
75
+ <MultiLevelSelect
76
+ id='multiselect-color'
77
+ onSelect={(selectedNodes) =>
78
+ console.log(
79
+ "Selected Items",
80
+ selectedNodes
81
+ )
82
+ }
83
+ pillColor="neutral"
84
+ treeData={treeData}
85
+ {...props}
86
+ />
87
+ </div>
88
+ )
89
+ };
90
+
91
+ export default MultiLevelSelectColor;
@@ -0,0 +1 @@
1
+ Change the form pill color by passing the optional `pill_color` prop. Product, Data, and Status colors are available options. Check them out <a href="https://playbook.powerapp.cloud/kits/form_pill#form-pill-colors" target="_blank">here</a> in the Form Pill colors example.
@@ -0,0 +1 @@
1
+ Change the form pill color by passing the optional `pillColor` prop. Product, Data, and Status colors are available options. Check them out <a href="https://playbook.powerapp.cloud/kits/form_pill/react#form-pill-colors" target="_blank">here</a> in the Form Pill colors example.
@@ -6,6 +6,7 @@ examples:
6
6
  - multi_level_select_return_all_selected: Return All Selected
7
7
  - multi_level_select_selected_ids: Selected Ids
8
8
  - multi_level_select_with_form: With Form
9
+ - multi_level_select_color: With Pills (Custom Color)
9
10
 
10
11
  react:
11
12
  - multi_level_select_default: Default
@@ -13,3 +14,4 @@ examples:
13
14
  - multi_level_select_single_children_only: Single Select w/ Hidden Radios
14
15
  - multi_level_select_return_all_selected: Return All Selected
15
16
  - multi_level_select_selected_ids_react: Selected Ids
17
+ - multi_level_select_color: With Pills (Custom Color)
@@ -3,3 +3,4 @@ export { default as MultiLevelSelectSingle } from './_multi_level_select_single.
3
3
  export { default as MultiLevelSelectSingleChildrenOnly } from './_multi_level_select_single_children_only.jsx'
4
4
  export { default as MultiLevelSelectReturnAllSelected } from './_multi_level_select_return_all_selected.jsx'
5
5
  export { default as MultiLevelSelectSelectedIdsReact } from "./_multi_level_select_selected_ids_react.jsx"
6
+ export { default as MultiLevelSelectColor } from './_multi_level_select_color.jsx'
@@ -19,6 +19,9 @@ module Playbook
19
19
  prop :variant, type: Playbook::Props::Enum,
20
20
  values: %w[multi single],
21
21
  default: "multi"
22
+ prop :pill_color, type: Playbook::Props::Enum,
23
+ values: %w[primary neutral success warning error info data_1 data_2 data_3 data_4 data_5 data_6 data_7 data_8 windows siding roofing doors gutters solar insulation accessories],
24
+ default: "primary"
22
25
 
23
26
  def classname
24
27
  generate_classname("pb_multi_level_select")
@@ -34,6 +37,7 @@ module Playbook
34
37
  selectedIds: selected_ids,
35
38
  input_name: input_name,
36
39
  variant: variant,
40
+ pillColor: pill_color,
37
41
  }
38
42
  end
39
43
  end
@@ -3,8 +3,25 @@
3
3
  @import "../tokens/opacity";
4
4
  @import "../pb_avatar/avatar";
5
5
 
6
+ @mixin avatar-size($size) {
7
+ height: $size;
8
+ width: $size;
9
+ .avatar_wrapper {
10
+ width: $size;
11
+ height: $size;
12
+ }
13
+ }
14
+
15
+ @mixin position($position) {
16
+ position: absolute;
17
+ @each $pos, $val in $position {
18
+ #{$pos}: $val;
19
+ }
20
+ }
21
+
6
22
  [class^=pb_multiple_users_stacked_kit] {
7
23
  $container_size: map-get($avatar-sizes, "xs");
24
+ $bubble_container_size: map-get($avatar-sizes, "sm");
8
25
  $overlap: -15px;
9
26
  $border_size: 1px;
10
27
  $stacked_size: 18px;
@@ -17,34 +34,24 @@
17
34
  flex-shrink: 0;
18
35
  flex-grow: 0;
19
36
  [class^=pb_avatar_kit].pb_multiple_users_stacked_item {
20
- height: $stacked_size;
21
- width: $stacked_size;
22
- &.dark {
23
- .avatar_wrapper {
24
- border: $pb_multiple_users_border_size solid $bg_dark;
25
- }
26
- }
37
+ @include avatar-size($stacked_size);
38
+ &.dark {
27
39
  .avatar_wrapper {
28
- border: $border_size solid $white;
29
- height: $stacked_size;
30
- width: $stacked_size;
31
- img {
32
- z-index: 0;
33
- }
40
+ border: $border_size solid $bg_dark;
34
41
  }
35
42
  }
36
- &[class*=_single] .pb_multiple_users_stacked_item {
37
- width: $container_size;
38
- height: $container_size;
39
43
  .avatar_wrapper {
40
- width: $container_size;
41
- height: $container_size;
44
+ border: $border_size solid $white;
45
+ img {
46
+ z-index: 0;
47
+ }
42
48
  }
43
49
  }
50
+ &[class*=_single] .pb_multiple_users_stacked_item {
51
+ @include avatar-size($container_size);
52
+ }
44
53
  [class^=pb_avatar_kit].second_item, [class^=pb_badge_kit].second_item {
45
- position: absolute;
46
- bottom: 0;
47
- right: 0;
54
+ @include position((bottom: 0, right: 0));
48
55
  z-index: 2;
49
56
  background: tint($primary, 90%);
50
57
  border-radius: $border_rad_mega;
@@ -63,4 +70,73 @@
63
70
  font-size: 0;
64
71
  color: transparent;
65
72
  }
73
+
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);
99
+ }
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));
113
+ }
114
+
115
+ &.quadruple_bubble {
116
+ @include position((bottom: 9px, right: 4px));
117
+ }
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));
126
+ }
127
+ }
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
+ }
141
+ }
66
142
  }
@@ -58,4 +58,170 @@ test('should pass aria prop', () => {
58
58
  render(<MultipleUsersStackedDefault />)
59
59
  const kit = screen.getByTestId(testId)
60
60
  expect(kit).toHaveAttribute('aria-label', testId)
61
+ })
62
+
63
+ const MultipleUsersStackedSingleBubble = () => {
64
+ return (
65
+ <MultipleUsersStacked
66
+ aria={{ label: testId }}
67
+ className={className}
68
+ data={{ testid: testId }}
69
+ users={[
70
+ {
71
+ name: "user1",
72
+ imageUrl: "imageUser1",
73
+ imageAlt: "nameUser1",
74
+ }
75
+ ]}
76
+ variant="bubble"
77
+ />
78
+ )
79
+ }
80
+
81
+ test('should have a single bubble', () => {
82
+ render(<MultipleUsersStackedSingleBubble />)
83
+ const kit = screen.getByTestId(testId)
84
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_single_bubble")
85
+
86
+ const firstItem = kit.querySelector('.first_item');
87
+ expect(firstItem).toBeInTheDocument();
88
+ })
89
+
90
+ const MultipleUsersStackedDoubleBubble = () => {
91
+ return (
92
+ <MultipleUsersStacked
93
+ aria={{ label: testId }}
94
+ className={className}
95
+ data={{ testid: testId }}
96
+ users={[
97
+ {
98
+ name: "user1",
99
+ imageUrl: "imageUser1",
100
+ imageAlt: "nameUser1",
101
+ },
102
+ {
103
+ name: "user2",
104
+ imageUrl: "imageUser2",
105
+ imageAlt: "nameUser2",
106
+ },
107
+ ]}
108
+ variant="bubble"
109
+ />
110
+ )
111
+ }
112
+
113
+ test('should have a double bubble', () => {
114
+ render(<MultipleUsersStackedDoubleBubble />)
115
+ const kit = screen.getByTestId(testId)
116
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
117
+
118
+ const firstItem = kit.querySelector('.first_item');
119
+ expect(firstItem).toBeInTheDocument();
120
+
121
+ const secondItem = kit.querySelector('.second_item');
122
+ expect(secondItem).toBeInTheDocument();
123
+ })
124
+
125
+ const MultipleUsersStackedTripleBubble = () => {
126
+ return (
127
+ <MultipleUsersStacked
128
+ aria={{ label: testId }}
129
+ className={className}
130
+ data={{ testid: testId }}
131
+ users={[
132
+ {
133
+ name: "user1",
134
+ imageUrl: "imageUser1",
135
+ imageAlt: "nameUser1",
136
+ },
137
+ {
138
+ name: "user2",
139
+ imageUrl: "imageUser2",
140
+ imageAlt: "nameUser2",
141
+ },
142
+ {
143
+ name: "user3",
144
+ imageUrl: "imageUser3",
145
+ imageAlt: "nameUser3",
146
+ },
147
+ ]}
148
+ variant="bubble"
149
+ />
150
+ )
151
+ }
152
+
153
+ test('should have a triple bubble', () => {
154
+ render(<MultipleUsersStackedTripleBubble />)
155
+ const kit = screen.getByTestId(testId)
156
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
157
+
158
+ const firstItem = kit.querySelector('.first_item');
159
+ expect(firstItem).toBeInTheDocument();
160
+ expect(firstItem).toHaveClass("triple_bubble")
161
+
162
+ const secondItem = kit.querySelector('.second_item');
163
+ expect(secondItem).toBeInTheDocument();
164
+ expect(secondItem).toHaveClass("triple_bubble")
165
+
166
+ const thirdItem = kit.querySelector('.third_item');
167
+ expect(thirdItem).toBeInTheDocument();
168
+ })
169
+
170
+ const MultipleUsersStackedQuadrupleBubble = () => {
171
+ return (
172
+ <MultipleUsersStacked
173
+ aria={{ label: testId }}
174
+ className={className}
175
+ data={{ testid: testId }}
176
+ users={[
177
+ {
178
+ name: "user1",
179
+ imageUrl: "imageUser1",
180
+ imageAlt: "nameUser1",
181
+ },
182
+ {
183
+ name: "user2",
184
+ imageUrl: "imageUser2",
185
+ imageAlt: "nameUser2",
186
+ },
187
+ {
188
+ name: "user3",
189
+ imageUrl: "imageUser3",
190
+ imageAlt: "nameUser3",
191
+ },
192
+ {
193
+ name: "user4",
194
+ imageUrl: "imageUser4",
195
+ imageAlt: "nameUser4",
196
+ },
197
+ {
198
+ name: "user5",
199
+ imageUrl: "imageUser5",
200
+ imageAlt: "nameUser5",
201
+ },
202
+ ]}
203
+ variant="bubble"
204
+ />
205
+ )
206
+ }
207
+
208
+ test('should have a quadruple bubble', () => {
209
+ render(<MultipleUsersStackedQuadrupleBubble />)
210
+ const kit = screen.getByTestId(testId)
211
+ expect(kit).toHaveClass("pb_multiple_users_stacked_kit_bubble")
212
+
213
+ const firstItem = kit.querySelector('.first_item');
214
+ expect(firstItem).toBeInTheDocument();
215
+ expect(firstItem).toHaveClass("quadruple_bubble")
216
+
217
+ const secondItem = kit.querySelector('.second_item');
218
+ expect(secondItem).toBeInTheDocument();
219
+ expect(secondItem).toHaveClass("quadruple_bubble")
220
+
221
+ const thirdItem = kit.querySelector('.third_item');
222
+ expect(thirdItem).toBeInTheDocument();
223
+ expect(thirdItem).toHaveClass("quadruple_bubble")
224
+
225
+ const fourthItem = kit.querySelector('.fourth_item');
226
+ expect(fourthItem).toBeInTheDocument();
61
227
  })
@@ -15,6 +15,7 @@ type MultipleUsersStackedProps = {
15
15
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
16
16
  id?: string,
17
17
  users: Array<{ [key: string]: string }>,
18
+ variant: "default" | "bubble",
18
19
  }
19
20
 
20
21
  const MultipleUsersStacked = (props: MultipleUsersStackedProps) => {
@@ -26,10 +27,14 @@ const MultipleUsersStacked = (props: MultipleUsersStackedProps) => {
26
27
  htmlOptions = {},
27
28
  id,
28
29
  users,
30
+ variant = "default",
29
31
  } = props
30
32
 
31
33
  const moreThanTwo = users.length > 2
32
34
  const onlyOne = users.length == 1
35
+ const isBubble = variant === "bubble"
36
+ const tripleBubble = isBubble && users.length === 3
37
+ const quadrupleBubble = isBubble && users.length > 3
33
38
  const displayCount = () => {
34
39
  return moreThanTwo ? 1 : users.length
35
40
  }
@@ -38,29 +43,61 @@ const MultipleUsersStacked = (props: MultipleUsersStackedProps) => {
38
43
  const htmlProps = buildHtmlProps(htmlOptions)
39
44
  const classes = classnames(buildCss(
40
45
  'pb_multiple_users_stacked_kit',
41
- { single: onlyOne }), globalProps(props), className)
46
+ { single: onlyOne, bubble: isBubble }), globalProps(props), className)
42
47
 
43
48
  const firstUser = () => {
44
49
  return users.slice(0, 1).map((userObject, index) => {
45
50
  return (
46
51
  <Avatar
47
52
  {...userObject}
48
- className="pb_multiple_users_stacked_item"
53
+ className={`pb_multiple_users_stacked_item first_item${tripleBubble ? " triple_bubble" : ""}${quadrupleBubble ? " quadruple_bubble" : ""}`}
49
54
  dark={dark}
50
55
  key={index}
51
- size="xs"
56
+ size={isBubble ? "sm" : "xs"}
52
57
  />
53
58
  )
54
59
  })
55
60
  }
56
61
 
57
62
  const secondUser = () => {
58
- if (moreThanTwo === false) {
63
+ if (!moreThanTwo || (isBubble && users.length > 1)) {
59
64
  return users.slice(1, 2).map((userObject, index) => {
60
65
  return (
61
66
  <Avatar
62
67
  {...userObject}
63
- className="pb_multiple_users_stacked_item second_item"
68
+ className={`pb_multiple_users_stacked_item second_item${tripleBubble ? " triple_bubble" : ""}${quadrupleBubble ? " quadruple_bubble" : ""}`}
69
+ dark={dark}
70
+ key={index}
71
+ size="xs"
72
+ />
73
+ )
74
+ })
75
+ }
76
+ }
77
+
78
+ const thirdUser = () => {
79
+ if (isBubble && users.length > 2) {
80
+ return users.slice(2, 3).map((userObject, index) => {
81
+ return (
82
+ <Avatar
83
+ {...userObject}
84
+ className={`pb_multiple_users_stacked_item third_item${quadrupleBubble ? " quadruple_bubble" : ""}`}
85
+ dark={dark}
86
+ key={index}
87
+ size="xs"
88
+ />
89
+ )
90
+ })
91
+ }
92
+ }
93
+
94
+ const fourthUser = () => {
95
+ if (isBubble && users.length > 3) {
96
+ return users.slice(3, 4).map((userObject, index) => {
97
+ return (
98
+ <Avatar
99
+ {...userObject}
100
+ className="pb_multiple_users_stacked_item fourth_item"
64
101
  dark={dark}
65
102
  key={index}
66
103
  size="xs"
@@ -71,7 +108,7 @@ const MultipleUsersStacked = (props: MultipleUsersStackedProps) => {
71
108
  }
72
109
 
73
110
  const plusUsers = () => {
74
- if (moreThanTwo === true) {
111
+ if (moreThanTwo && !isBubble) {
75
112
  return (
76
113
  <Badge
77
114
  className="pb_multiple_users_stacked_item second_item"
@@ -94,6 +131,8 @@ const MultipleUsersStacked = (props: MultipleUsersStackedProps) => {
94
131
  >
95
132
  {firstUser()}
96
133
  {secondUser()}
134
+ {thirdUser()}
135
+ {fourthUser()}
97
136
  {plusUsers()}
98
137
  </div>
99
138
  )
@@ -0,0 +1,73 @@
1
+ <%= pb_rails("multiple_users_stacked", props: {
2
+ variant: "bubble",
3
+ users: [
4
+ {
5
+ name: "Patrick Welch",
6
+ image_url: "https://randomuser.me/api/portraits/men/9.jpg",
7
+ }
8
+ ]
9
+ }) %>
10
+
11
+ <br/><br/>
12
+
13
+ <%= pb_rails("multiple_users_stacked", props: {
14
+ variant: "bubble",
15
+ users: [
16
+ {
17
+ name: "Patrick Welch",
18
+ image_url: "https://randomuser.me/api/portraits/men/9.jpg",
19
+ },
20
+ {
21
+ name: "Lucille Sanchez",
22
+ image_url: "https://randomuser.me/api/portraits/women/6.jpg",
23
+ }
24
+ ]
25
+ }) %>
26
+
27
+ <br/><br/>
28
+
29
+ <%= pb_rails("multiple_users_stacked", props: {
30
+ variant: "bubble",
31
+ users: [
32
+ {
33
+ name: "Patrick Welch",
34
+ image_url: "https://randomuser.me/api/portraits/men/9.jpg",
35
+ },
36
+ {
37
+ name: "Lucille Sanchez",
38
+ image_url: "https://randomuser.me/api/portraits/women/6.jpg",
39
+ },
40
+ {
41
+ name: "Beverly Reyes",
42
+ image_url: "https://randomuser.me/api/portraits/women/74.jpg",
43
+ },
44
+ ]
45
+ }) %>
46
+
47
+ <br/><br/>
48
+
49
+ <%= pb_rails("multiple_users_stacked", props: {
50
+ variant: "bubble",
51
+ users: [
52
+ {
53
+ name: "Patrick Welch",
54
+ image_url: "https://randomuser.me/api/portraits/men/9.jpg",
55
+ },
56
+ {
57
+ name: "Lucille Sanchez",
58
+ image_url: "https://randomuser.me/api/portraits/women/6.jpg",
59
+ },
60
+ {
61
+ name: "Beverly Reyes",
62
+ image_url: "https://randomuser.me/api/portraits/women/74.jpg",
63
+ },
64
+ {
65
+ name: "Keith Craig",
66
+ image_url: "https://randomuser.me/api/portraits/men/40.jpg",
67
+ },
68
+ {
69
+ name: "Alicia Cooper",
70
+ image_url: "https://randomuser.me/api/portraits/women/46.jpg",
71
+ }
72
+ ]
73
+ }) %>