playbook_ui 14.3.2 → 14.4.0.pre.alpha.PBNTR550typeaheadformpilltruncate3895

Sign up to get free protection for your applications and to get access to all the features.
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
+ }) %>