playbook_ui 14.3.2.pre.alpha.PBNTR515typeaheadmarginbottomredux3756 → 14.3.2.pre.alpha.pbntr523enablekitsforradiofix3809

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +2 -3
  3. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +245 -23
  4. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +1 -1
  5. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.html.erb +117 -0
  6. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.jsx +227 -0
  7. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.md +1 -0
  8. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  9. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  10. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +1 -1
  11. data/app/pb_kits/playbook/pb_icon/icon.rb +1 -1
  12. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +5 -1
  13. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +72 -0
  14. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +91 -0
  15. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_rails.md +1 -0
  16. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_react.md +1 -0
  17. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  18. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  19. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +4 -0
  20. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +97 -21
  21. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.test.js +166 -0
  22. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +45 -6
  23. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.html.erb +73 -0
  24. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.jsx +86 -0
  25. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/example.yml +2 -0
  26. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/index.js +1 -0
  27. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +6 -2
  28. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.rb +21 -1
  29. data/app/pb_kits/playbook/pb_radio/_radio.tsx +92 -33
  30. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.html.erb +48 -0
  31. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +59 -0
  32. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.md +1 -0
  33. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -0
  34. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  35. data/app/pb_kits/playbook/pb_radio/index.js +17 -0
  36. data/app/pb_kits/playbook/pb_radio/radio.html.erb +35 -13
  37. data/app/pb_kits/playbook/pb_radio/radio.rb +3 -1
  38. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +1 -0
  39. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +9 -7
  40. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +4 -3
  41. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +5 -6
  42. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +26 -18
  43. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +31 -0
  44. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +26 -0
  45. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_rails.md +1 -0
  46. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_react.md +1 -0
  47. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -2
  48. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -1
  49. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +1 -2
  50. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +5 -6
  51. data/app/pb_kits/playbook/tokens/_colors.scss +2 -0
  52. data/dist/chunks/{_typeahead-BOgF-ybo.js → _typeahead-468tQVei.js} +2 -2
  53. data/dist/chunks/{_weekday_stacked-COb2q6KQ.js → _weekday_stacked-CODev76A.js} +2 -2
  54. data/dist/chunks/lib-D2U4I1U6.js +16 -0
  55. data/dist/chunks/{pb_form_validation-u2wnZ3oe.js → pb_form_validation-zV9OpdSt.js} +1 -1
  56. data/dist/chunks/vendor.js +1 -1
  57. data/dist/playbook-doc.js +1 -1
  58. data/dist/playbook-rails-react-bindings.js +1 -1
  59. data/dist/playbook-rails.js +1 -1
  60. data/dist/playbook.css +1 -1
  61. data/lib/playbook/version.rb +1 -1
  62. metadata +23 -8
  63. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.html.erb +0 -88
  64. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.jsx +0 -60
  65. data/dist/chunks/lib-D9uVVKnh.js +0 -16
@@ -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
+ }) %>
@@ -0,0 +1,86 @@
1
+ import React from 'react'
2
+
3
+ import MultipleUsersStacked from '../_multiple_users_stacked'
4
+
5
+ const MultipleUsersStackedBubble = (props) => {
6
+ return (
7
+ <div>
8
+ <MultipleUsersStacked
9
+ users={[
10
+ {
11
+ name: 'Patrick Welch',
12
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
13
+ },
14
+ ]}
15
+ variant="bubble"
16
+ {...props}
17
+ />
18
+ <br />
19
+ <br />
20
+ <MultipleUsersStacked
21
+ users={[
22
+ {
23
+ name: 'Patrick Welch',
24
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
25
+ },
26
+ {
27
+ name: 'Lucille Sanchez',
28
+ imageUrl: 'https://randomuser.me/api/portraits/women/6.jpg',
29
+ },
30
+ ]}
31
+ variant="bubble"
32
+ {...props}
33
+ />
34
+ <br />
35
+ <br />
36
+ <MultipleUsersStacked
37
+ users={[
38
+ {
39
+ name: 'Patrick Welch',
40
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
41
+ },
42
+ {
43
+ name: 'Lucille Sanchez',
44
+ imageUrl: 'https://randomuser.me/api/portraits/women/6.jpg',
45
+ },
46
+ {
47
+ name: 'Beverly Reyes',
48
+ imageUrl: 'https://randomuser.me/api/portraits/women/74.jpg',
49
+ },
50
+ ]}
51
+ variant="bubble"
52
+ {...props}
53
+ />
54
+ <br />
55
+ <br />
56
+ <MultipleUsersStacked
57
+ users={[
58
+ {
59
+ name: 'Patrick Welch',
60
+ imageUrl: 'https://randomuser.me/api/portraits/men/9.jpg',
61
+ },
62
+ {
63
+ name: 'Lucille Sanchez',
64
+ imageUrl: 'https://randomuser.me/api/portraits/women/6.jpg',
65
+ },
66
+ {
67
+ name: 'Beverly Reyes',
68
+ imageUrl: 'https://randomuser.me/api/portraits/women/74.jpg',
69
+ },
70
+ {
71
+ name: 'Keith Craig',
72
+ imageUrl: 'https://randomuser.me/api/portraits/men/40.jpg',
73
+ },
74
+ {
75
+ name: 'Alicia Cooper',
76
+ imageUrl: 'https://randomuser.me/api/portraits/women/46.jpg',
77
+ },
78
+ ]}
79
+ variant="bubble"
80
+ {...props}
81
+ />
82
+ </div>
83
+ )
84
+ }
85
+
86
+ export default MultipleUsersStackedBubble
@@ -2,10 +2,12 @@ examples:
2
2
 
3
3
  rails:
4
4
  - multiple_users_stacked_default: Default
5
+ - multiple_users_stacked_bubble: Bubble
5
6
 
6
7
 
7
8
  react:
8
9
  - multiple_users_stacked_default: Default
10
+ - multiple_users_stacked_bubble: Bubble
9
11
 
10
12
  swift:
11
13
  - multiple_users_stacked_default_swift: Default
@@ -1 +1,2 @@
1
1
  export { default as MultipleUsersStackedDefault } from './_multiple_users_stacked_default.jsx'
2
+ export { default as MultipleUsersStackedBubble } from './_multiple_users_stacked_bubble.jsx'
@@ -1,14 +1,18 @@
1
1
  <%= pb_content_tag do %>
2
- <%= pb_rails("avatar", props: object.users[0].merge({size: "xs", classname: "pb_multiple_users_stacked_item", dark: object.dark}) ) %>
2
+ <%= pb_rails("avatar", props: object.users[0].merge({size: object.bubble ? "sm" : "xs", classname: "pb_multiple_users_stacked_item first_item#{object.triple_bubble ? " triple_bubble" : ""}#{object.quadruple_bubble ? " quadruple_bubble" : ""}", dark: object.dark}) ) %>
3
3
 
4
4
  <% unless object.only_one %>
5
- <% if object.more_than_two %>
5
+ <% if object.more_than_two && !object.bubble %>
6
6
  <%= pb_rails("badge", props: {
7
7
  dark: object.dark,
8
8
  text: "+#{object.users.count - object.display_count}",
9
9
  variant: "primary",
10
10
  rounded: true,
11
11
  classname: "pb_multiple_users_stacked_item second_item" }) %>
12
+ <% elsif object.bubble %>
13
+ <% object.users.slice(1,3).each_with_index do |item, idx| %>
14
+ <%= pb_rails("avatar", props: item.merge({size: "xs", classname: "pb_multiple_users_stacked_item #{idx == 0 ? "second_item#{object.triple_bubble ? " triple_bubble" : ""}#{object.quadruple_bubble ? " quadruple_bubble" : ""}" : idx == 1 ? "third_item#{object.quadruple_bubble ? " quadruple_bubble" : ""}" : "fourth_item"}", dark: object.dark}) ) %>
15
+ <% end %>
12
16
  <% else %>
13
17
  <%= pb_rails("avatar", props: object.users[1].merge({size: "xs", classname: "pb_multiple_users_stacked_item second_item", dark: object.dark}) ) %>
14
18
  <% end %>
@@ -5,6 +5,10 @@ module Playbook
5
5
  class MultipleUsersStacked < Playbook::KitBase
6
6
  prop :users, type: Playbook::Props::HashArray, required: true
7
7
 
8
+ prop :variant, type: Playbook::Props::Enum,
9
+ values: %w[default bubble],
10
+ default: "default"
11
+
8
12
  def more_than_two
9
13
  users.count > 2
10
14
  end
@@ -17,8 +21,20 @@ module Playbook
17
21
  more_than_two ? 1 : users.count
18
22
  end
19
23
 
24
+ def bubble
25
+ variant == "bubble"
26
+ end
27
+
28
+ def triple_bubble
29
+ bubble && users.count === 3
30
+ end
31
+
32
+ def quadruple_bubble
33
+ bubble && users.count > 3
34
+ end
35
+
20
36
  def classname
21
- generate_classname("pb_multiple_users_stacked_kit", single_class)
37
+ generate_classname("pb_multiple_users_stacked_kit", single_class, bubble_class)
22
38
  end
23
39
 
24
40
  private
@@ -26,6 +42,10 @@ module Playbook
26
42
  def single_class
27
43
  only_one ? "single" : nil
28
44
  end
45
+
46
+ def bubble_class
47
+ bubble ? "bubble" : nil
48
+ end
29
49
  end
30
50
  end
31
51
  end
@@ -1,28 +1,30 @@
1
- /*eslint-disable react/no-multi-comp, flowtype/space-before-type-colon */
1
+ /*eslint-disable react/no-multi-comp */
2
2
 
3
- import React, { forwardRef } from 'react'
3
+ import React, { forwardRef, useRef } from 'react'
4
4
  import Body from '../pb_body/_body'
5
+ import Flex from '../pb_flex/_flex'
5
6
  import classnames from 'classnames'
6
7
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
7
8
  import { globalProps, GlobalProps } from '../utilities/globalProps'
8
9
 
9
10
  type RadioProps = {
10
- aria?: {[key: string]: string},
11
+ aria?: { [key: string]: string },
11
12
  alignment?: string,
12
13
  checked?: boolean,
13
14
  children?: React.ReactChild[] | React.ReactChild,
15
+ customChildren?: boolean,
14
16
  className?: string,
15
17
  dark?: boolean,
16
- data?: {[key: string]: string},
18
+ data?: { [key: string]: string },
17
19
  disabled?: boolean,
18
20
  error?: boolean,
19
- htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
21
+ htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
20
22
  id?: string,
21
23
  label: string,
22
24
  name?: string,
23
25
  value?: string,
24
26
  text?: string,
25
- onChange: (event: React.FormEvent<HTMLInputElement> | null)=>void,
27
+ onChange: (event: React.FormEvent<HTMLInputElement> | null) => void,
26
28
  } & GlobalProps
27
29
 
28
30
  const Radio = ({
@@ -30,10 +32,11 @@ const Radio = ({
30
32
  alignment,
31
33
  children,
32
34
  className,
35
+ customChildren,
33
36
  dark = false,
34
- data = {},
35
37
  disabled = false,
36
38
  error = false,
39
+ data = {},
37
40
  htmlOptions = {},
38
41
  id,
39
42
  label,
@@ -43,17 +46,28 @@ const Radio = ({
43
46
  onChange = () => { void 0 },
44
47
  ...props
45
48
  }: RadioProps, ref: any) => {
46
- const ariaProps = buildAriaProps(aria)
47
- const dataProps = buildDataProps(data)
48
- const htmlProps = buildHtmlProps(htmlOptions)
49
+ const radioRef = useRef(null);
50
+
51
+ const ariaProps = buildAriaProps(aria);
52
+ const dataProps = buildDataProps(data);
53
+ const htmlProps = buildHtmlProps(htmlOptions);
49
54
  const classes = classnames(
50
- buildCss('pb_radio_kit', alignment ),
51
- dark ? 'dark': null, error ? 'error': null,
55
+ buildCss('pb_radio_kit', alignment),
56
+ dark ? 'dark' : null,
57
+ error ? 'error' : null,
52
58
  globalProps(props),
53
- className)
59
+ className
60
+ );
61
+
62
+ const classesCustom = classnames(
63
+ dark ? 'dark' : null,
64
+ error ? 'error' : null,
65
+ globalProps(props),
66
+ className
67
+ );
54
68
 
55
69
  const displayRadio = (props: RadioProps & any) => {
56
- if (children)
70
+ if (children && customChildren == false)
57
71
  return (children)
58
72
  else
59
73
  return (
@@ -70,24 +84,69 @@ const Radio = ({
70
84
  />
71
85
  )}
72
86
 
87
+ const handleContainerClick = (event: React.MouseEvent<HTMLDivElement, MouseEvent> | undefined) => {
88
+ if (event) {
89
+ const target = event.target as HTMLElement;
90
+ if (
91
+ target.id === 'pb-radio-children-wrapper' ||
92
+ target.closest('#pb-radio-children-wrapper')
93
+ ) {
94
+ radioRef.current?.click();
95
+ }
96
+ }
97
+ };
98
+
73
99
  return (
74
- <label
75
- {...ariaProps}
76
- {...dataProps}
77
- {...htmlProps}
78
- className={classes}
79
- htmlFor={id}
80
- >
81
- <>{displayRadio(props)}</>
82
- <span className="pb_radio_button" />
83
- <Body
84
- dark={dark}
85
- status={error ? 'negative' : null}
86
- text={label}
87
- variant={null}
88
- />
89
- </label>
90
- )
91
- }
100
+ customChildren ? (
101
+ <Flex
102
+ {...ariaProps}
103
+ {...dataProps}
104
+ {...htmlProps}
105
+ align='center'
106
+ className={classesCustom}
107
+ cursor='pointer'
108
+ htmlFor={id}
109
+ htmlOptions={{
110
+ onClick: ((event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
111
+ handleContainerClick(event);
112
+ }) as unknown as () => void
113
+ }}
114
+ id="radio-container"
115
+ >
116
+ <label className={buildCss('pb_radio_kit', alignment)}>
117
+ <input
118
+ disabled={disabled}
119
+ id={id}
120
+ name={name}
121
+ onChange={onChange}
122
+ ref={radioRef}
123
+ type="radio"
124
+ value={value}
125
+ {...props}
126
+ />
127
+ <span className="pb_radio_button" />
128
+ </label>
129
+ <div id="pb-radio-children-wrapper"> {children} </div>
130
+ </Flex>
131
+ ) : (
132
+ <label
133
+ {...ariaProps}
134
+ {...dataProps}
135
+ {...htmlProps}
136
+ className={classes}
137
+ htmlFor={id}
138
+ >
139
+ <>{displayRadio(props)}</>
140
+ <span className="pb_radio_button" />
141
+ <Body
142
+ dark={dark}
143
+ status={error ? 'negative' : null}
144
+ text={label}
145
+ variant={null}
146
+ />
147
+ </label>
148
+ )
149
+ );
150
+ };
92
151
 
93
- export default forwardRef(Radio)
152
+ export default forwardRef(Radio);