playbook_ui 7.5.1 → 7.6.2.pre.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/sample_screenshot.svg +7 -0
  3. data/app/controllers/playbook/application_controller.rb +0 -2
  4. data/app/pb_kits/playbook/_playbook.scss +2 -1
  5. data/app/pb_kits/playbook/data/menu.yml +2 -6
  6. data/app/pb_kits/playbook/index.js +3 -0
  7. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +0 -2
  8. data/app/pb_kits/playbook/pb_background/_background.html.erb +18 -12
  9. data/app/pb_kits/playbook/pb_background/_background.jsx +14 -10
  10. data/app/pb_kits/playbook/pb_background/docs/_background_dark.jsx +4 -6
  11. data/app/pb_kits/playbook/pb_background/docs/_background_gradient.jsx +4 -6
  12. data/app/pb_kits/playbook/pb_background/docs/_background_image.jsx +20 -22
  13. data/app/pb_kits/playbook/pb_background/docs/_background_light.jsx +4 -6
  14. data/app/pb_kits/playbook/pb_background/docs/_background_white.jsx +1 -1
  15. data/app/pb_kits/playbook/pb_button/_button.scss +0 -1
  16. data/app/pb_kits/playbook/pb_checkbox/_checkbox.html.erb +1 -1
  17. data/app/pb_kits/playbook/pb_form_group/_form_group.html.erb +7 -0
  18. data/app/pb_kits/playbook/pb_form_group/_form_group.jsx +41 -0
  19. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +115 -0
  20. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_button.html.erb +12 -0
  21. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_button.jsx +37 -0
  22. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_date_picker.html.erb +6 -0
  23. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_date_picker.jsx +19 -0
  24. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_default.html.erb +7 -0
  25. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_default.jsx +23 -0
  26. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_select.html.erb +19 -0
  27. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_select.jsx +33 -0
  28. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_selectable_card.html.erb +21 -0
  29. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_selectable_card.jsx +40 -0
  30. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_selectable_card_icon.html.erb +19 -0
  31. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_selectable_card_icon.jsx +33 -0
  32. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_typeahead.html.erb +14 -0
  33. data/app/pb_kits/playbook/pb_form_group/docs/_form_group_typeahead.jsx +30 -0
  34. data/app/pb_kits/playbook/pb_form_group/docs/example.yml +20 -0
  35. data/app/pb_kits/playbook/pb_form_group/docs/index.js +7 -0
  36. data/app/pb_kits/playbook/pb_form_group/form_group.rb +15 -0
  37. data/app/pb_kits/playbook/pb_image/_image.html.erb +2 -1
  38. data/app/pb_kits/playbook/pb_image/_image.jsx +7 -1
  39. data/app/pb_kits/playbook/pb_image/_image.scss +40 -14
  40. data/app/pb_kits/playbook/pb_image/docs/_default_image.html.erb +12 -0
  41. data/app/pb_kits/playbook/pb_image/docs/_default_image.jsx +25 -3
  42. data/app/pb_kits/playbook/pb_image/docs/_rounded_image.html.erb +17 -0
  43. data/app/pb_kits/playbook/pb_image/docs/_rounded_image.jsx +36 -0
  44. data/app/pb_kits/playbook/pb_image/docs/example.yml +2 -0
  45. data/app/pb_kits/playbook/pb_image/docs/index.js +1 -0
  46. data/app/pb_kits/playbook/pb_image/image.rb +16 -1
  47. data/app/pb_kits/playbook/pb_list/_list.jsx +9 -2
  48. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_image.html.erb +27 -0
  49. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_image.jsx +61 -0
  50. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_image.md +1 -0
  51. data/app/pb_kits/playbook/pb_selectable_card/docs/example.yml +2 -0
  52. data/app/pb_kits/playbook/pb_selectable_card/docs/index.js +1 -0
  53. data/app/pb_kits/playbook/pb_selectable_list/_item.jsx +90 -0
  54. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.html.erb +11 -0
  55. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.jsx +47 -0
  56. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss +17 -0
  57. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list_item.html.erb +18 -0
  58. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.html.erb +27 -0
  59. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.jsx +29 -0
  60. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.html.erb +27 -0
  61. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.jsx +29 -0
  62. data/app/pb_kits/playbook/pb_selectable_list/docs/example.yml +12 -0
  63. data/app/pb_kits/playbook/pb_selectable_list/docs/index.js +2 -0
  64. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +24 -0
  65. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +28 -0
  66. data/lib/playbook/version.rb +1 -1
  67. metadata +47 -9
@@ -0,0 +1,40 @@
1
+ import React, { useState } from 'react'
2
+ import { FormGroup, SelectableCard } from '../../'
3
+
4
+ const FormGroupSelectableCard = () => {
5
+ const [value, setValue] = useState('')
6
+
7
+ const handleSelect = (event) => {
8
+ setValue(event.target.value)
9
+ }
10
+
11
+ return (
12
+ <div>
13
+ <FormGroup>
14
+ <SelectableCard
15
+ checked={value === 'cat'}
16
+ inputId="cat1"
17
+ multi={false}
18
+ name="animal"
19
+ onChange={handleSelect}
20
+ value="cat"
21
+ >
22
+ {'Cat'}
23
+ </SelectableCard>
24
+
25
+ <SelectableCard
26
+ checked={value === 'dog'}
27
+ inputId="dog1"
28
+ multi={false}
29
+ name="animal"
30
+ onChange={handleSelect}
31
+ value="dog"
32
+ >
33
+ {'Dog'}
34
+ </SelectableCard>
35
+ </FormGroup>
36
+ </div>
37
+ )
38
+ }
39
+
40
+ export default FormGroupSelectableCard
@@ -0,0 +1,19 @@
1
+ <div>
2
+ <%= pb_rails("form_group") do %>
3
+ <%= pb_rails("selectable_card_icon", props: {
4
+ icon: "basketball-ball",
5
+ title_text: "Basketball",
6
+ input_id: 7,
7
+ multi: false,
8
+ name: "select",
9
+ }) %>
10
+
11
+ <%= pb_rails("selectable_card_icon", props: {
12
+ icon: "football-ball",
13
+ title_text: "Football",
14
+ input_id: 8,
15
+ multi: false,
16
+ name: "select",
17
+ }) %>
18
+ <% end %>
19
+ </div>
@@ -0,0 +1,33 @@
1
+ import React, { useState } from 'react'
2
+ import { FormGroup, SelectableCardIcon } from '../../'
3
+
4
+ const FormGroupSelectableCardIcon = () => {
5
+ const [selectedFormat, toggleFormat] = useState(null)
6
+
7
+ return (
8
+ <div>
9
+ <FormGroup>
10
+ <SelectableCardIcon
11
+ checked={selectedFormat === 'basketball'}
12
+ icon="basketball-ball"
13
+ inputId={7}
14
+ name="select"
15
+ onChange={() => toggleFormat('basketball')}
16
+ titleText="Basketball"
17
+ value="basketball"
18
+ />
19
+ <SelectableCardIcon
20
+ checked={selectedFormat === 'football'}
21
+ icon="football-ball"
22
+ inputId={8}
23
+ name="select"
24
+ onChange={() => toggleFormat('football')}
25
+ titleText="Football"
26
+ value="football"
27
+ />
28
+ </FormGroup>
29
+ </div>
30
+ )
31
+ }
32
+
33
+ export default FormGroupSelectableCardIcon
@@ -0,0 +1,14 @@
1
+ <div>
2
+ <%= pb_rails("form_group") do %>
3
+ <%= pb_rails("typeahead", props: {
4
+ label: "Products",
5
+ options: [
6
+ { label: 'Windows', value: 'windows' },
7
+ { label: 'Roof', value: 'roof' },
8
+ { label: 'Siding', value: 'siding' },
9
+ { label: 'Doors', value: 'doors' },
10
+ ]
11
+ }) %>
12
+ <%= pb_rails("button", props: { text: "Add", variant: "secondary" }) %>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import { Button, FormGroup, Typeahead } from '../../'
3
+
4
+ const FormGroupTypeahead = (props) => {
5
+ const options = [
6
+ { label: 'Windows', value: 'windows' },
7
+ { label: 'Roof', value: 'roof' },
8
+ { label: 'Siding', value: 'siding' },
9
+ { label: 'Doors', value: 'doors' },
10
+ ]
11
+
12
+ return (
13
+ <div>
14
+ <FormGroup>
15
+ <Typeahead
16
+ label="Products"
17
+ options={options}
18
+ />
19
+ <Button
20
+ onClick={() => alert('Button Clicked!')}
21
+ text="Add"
22
+ variant="secondary"
23
+ {...props}
24
+ />
25
+ </FormGroup>
26
+ </div>
27
+ )
28
+ }
29
+
30
+ export default FormGroupTypeahead
@@ -0,0 +1,20 @@
1
+ examples:
2
+
3
+ rails:
4
+ - form_group_default: Default
5
+ - form_group_button: Button
6
+ - form_group_date_picker: Date Picker
7
+ - form_group_typeahead: Typeahead
8
+ - form_group_select: Select
9
+ - form_group_selectable_card: Selectable Card
10
+ - form_group_selectable_card_icon: Selectable Card Icon
11
+
12
+
13
+ react:
14
+ - form_group_default: Default
15
+ - form_group_button: Button
16
+ - form_group_date_picker: Date Picker
17
+ - form_group_typeahead: Typeahead
18
+ - form_group_select: Select
19
+ - form_group_selectable_card: Selectable Card
20
+ - form_group_selectable_card_icon: Selectable Card Icon
@@ -0,0 +1,7 @@
1
+ export { default as FormGroupDefault } from './_form_group_default.jsx'
2
+ export { default as FormGroupButton } from './_form_group_button.jsx'
3
+ export { default as FormGroupDatePicker } from './_form_group_date_picker.jsx'
4
+ export { default as FormGroupTypeahead } from './_form_group_typeahead.jsx'
5
+ export { default as FormGroupSelect } from './_form_group_select.jsx'
6
+ export { default as FormGroupSelectableCard } from './_form_group_selectable_card.jsx'
7
+ export { default as FormGroupSelectableCardIcon } from './_form_group_selectable_card_icon.jsx'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbFormGroup
5
+ class FormGroup
6
+ include Playbook::Props
7
+
8
+ partial "pb_form_group/form_group"
9
+
10
+ def classname
11
+ generate_classname("pb_form_group_kit")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,4 +4,5 @@
4
4
  class: object.classname,
5
5
  aria: object.aria,
6
6
  src: object.url,
7
- alt: object.alt) %>
7
+ alt: object.alt)
8
+ %>
@@ -11,6 +11,8 @@ type ImageProps = {
11
11
  className?: string,
12
12
  data?: object,
13
13
  id?: string,
14
+ size: "xs" | "sm" | "md" | "lg" | "xl",
15
+ rounded?: boolean,
14
16
  url: string,
15
17
  }
16
18
 
@@ -21,12 +23,15 @@ const Image = (props: ImageProps) => {
21
23
  className,
22
24
  data = {},
23
25
  id,
26
+ rounded = false,
27
+ size = '',
24
28
  url = '',
25
29
  } = props
26
30
 
27
31
  const ariaProps = buildAriaProps(aria)
28
32
  const classes = classnames(
29
- buildCss('pb_image lazyload blur_up'),
33
+ buildCss('pb_image_kit lazyload blur_up', size),
34
+ { rounded },
30
35
  globalProps(props),
31
36
  className
32
37
  )
@@ -41,6 +46,7 @@ const Image = (props: ImageProps) => {
41
46
  className={classes}
42
47
  data-src={url}
43
48
  id={id}
49
+ rounded={rounded}
44
50
  src={url}
45
51
  />
46
52
  </div>
@@ -1,15 +1,41 @@
1
- .pb_image_kit {
2
- max-width: 100%;
3
- max-height: 100%;
4
-
5
- .blur_up {
6
- -webkit-filter: blur(6px);
7
- filter: blur(6px);
8
- transition: filter 550ms, -webkit-filter 550ms;
9
- }
10
-
11
- .blur_up.lazyloaded {
12
- -webkit-filter: blur(0);
13
- filter: blur(0);
14
- }
1
+ @import "../tokens/border_radius";
2
+ @import "../tokens/colors";
3
+
4
+ $image-sizes: (
5
+ "xs": 60px,
6
+ "sm": 80px,
7
+ "md": 100px,
8
+ "lg": 120px,
9
+ "xl": 140px,
10
+ );
11
+
12
+ [class^=pb_image_kit] {
13
+ position: relative;
14
+
15
+ @each $name, $size in $image-sizes {
16
+ &[class*=_#{$name}] {
17
+ width: $size;
18
+ height: $size;
19
+ object-fit: cover;
20
+ position: relative;
21
+ flex-shrink: 0;
22
+ flex-grow: 0;
23
+ flex-basis: $size;
24
+ }
25
+
26
+ &[class*= rounded] {
27
+ border-radius: $border-rad-heaviest;
28
+ }
29
+
30
+ .blur_up {
31
+ -webkit-filter: blur(6px);
32
+ filter: blur(6px);
33
+ transition: filter 550ms, -webkit-filter 550ms;
34
+ }
35
+
36
+ .blur_up.lazyloaded {
37
+ -webkit-filter: blur(0);
38
+ filter: blur(0);
39
+ }
40
+ }
15
41
  }
@@ -1 +1,13 @@
1
+
2
+ <br/>
3
+ <%= pb_rails("image", props: { size: "xs", url: "https://unsplash.it/500/400/?image=634" }) %>
4
+ <br/>
5
+ <%= pb_rails("image", props: { size: "sm", url: "https://unsplash.it/500/400/?image=634" }) %>
6
+ <br/>
7
+ <%= pb_rails("image", props: { size: "md", url: "https://unsplash.it/500/400/?image=634" }) %>
8
+ <br/>
9
+ <%= pb_rails("image", props: { size: "lg", url: "https://unsplash.it/500/400/?image=634" }) %>
10
+ <br/>
11
+ <%= pb_rails("image", props: { size: "xl", url: "https://unsplash.it/500/400/?image=634" }) %>
12
+ <br/>
1
13
  <%= pb_rails("image", props: { url: "https://unsplash.it/500/400/?image=634" }) %>
@@ -3,9 +3,31 @@ import { Image } from '../../'
3
3
 
4
4
  const DefaultImage = () => {
5
5
  return (
6
- <Image
7
- url="https://unsplash.it/500/400/?image=634"
8
- />
6
+ <>
7
+ <Image
8
+ size="xs"
9
+ url="https://unsplash.it/500/400/?image=634"
10
+ />
11
+ <Image
12
+ size="sm"
13
+ url="https://unsplash.it/500/400/?image=634"
14
+ />
15
+ <Image
16
+ size="md"
17
+ url="https://unsplash.it/500/400/?image=634"
18
+ />
19
+ <Image
20
+ size="lg"
21
+ url="https://unsplash.it/500/400/?image=634"
22
+ />
23
+ <Image
24
+ size="xl"
25
+ url="https://unsplash.it/500/400/?image=634"
26
+ />
27
+ <Image
28
+ url="https://unsplash.it/500/400/?image=634"
29
+ />
30
+ </>
9
31
  )
10
32
  }
11
33
 
@@ -0,0 +1,17 @@
1
+ <%= pb_rails("image", props: { rounded: true, size: "xs", url: "https://unsplash.it/500/400/?image=634" }) %>
2
+
3
+ <br>
4
+
5
+ <%= pb_rails("image", props: { rounded: true, size: "sm", url: "https://unsplash.it/500/400/?image=634" }) %>
6
+
7
+ <br>
8
+
9
+ <%= pb_rails("image", props: { rounded: true, size: "md", url: "https://unsplash.it/500/400/?image=634" }) %>
10
+
11
+ <br>
12
+
13
+ <%= pb_rails("image", props: { rounded: true, size: "lg", url: "https://unsplash.it/500/400/?image=634" }) %>
14
+
15
+ <br>
16
+
17
+ <%= pb_rails("image", props: { rounded: true, size: "xl", url: "https://unsplash.it/500/400/?image=634" }) %>
@@ -0,0 +1,36 @@
1
+ import React from 'react'
2
+ import { Image } from '../../'
3
+
4
+ const RoundedImage = () => {
5
+ return (
6
+ <>
7
+ <Image
8
+ rounded
9
+ size="xs"
10
+ url="https://unsplash.it/500/400/?image=634"
11
+ />
12
+ <Image
13
+ rounded
14
+ size="sm"
15
+ url="https://unsplash.it/500/400/?image=634"
16
+ />
17
+ <Image
18
+ rounded
19
+ size="md"
20
+ url="https://unsplash.it/500/400/?image=634"
21
+ />
22
+ <Image
23
+ rounded
24
+ size="lg"
25
+ url="https://unsplash.it/500/400/?image=634"
26
+ />
27
+ <Image
28
+ rounded
29
+ size="xl"
30
+ url="https://unsplash.it/500/400/?image=634"
31
+ />
32
+ </>
33
+ )
34
+ }
35
+
36
+ export default RoundedImage
@@ -1,5 +1,7 @@
1
1
  examples:
2
2
  rails:
3
3
  - default_image: Default
4
+ - rounded_image: Rounded
4
5
  react:
5
6
  - default_image: Default
7
+ - rounded_image: Rounded
@@ -1 +1,2 @@
1
1
  export { default as DefaultImage } from './_default_image.jsx'
2
+ export { default as RoundedImage } from './_rounded_image.jsx'
@@ -8,10 +8,25 @@ module Playbook
8
8
  partial "pb_image/image"
9
9
 
10
10
  prop :alt
11
+ prop :rounded, type: Playbook::Props::Boolean,
12
+ default: false
13
+ prop :size, type: Playbook::Props::Enum,
14
+ values: %w[xs sm md lg xl none],
15
+ default: "none"
11
16
  prop :url
12
17
 
13
18
  def classname
14
- generate_classname("pb_image_kit lazyload blur_up")
19
+ generate_classname("pb_image_kit lazyload blur_up", size_class) + rounded_class
20
+ end
21
+
22
+ private
23
+
24
+ def rounded_class
25
+ rounded ? " rounded" : ""
26
+ end
27
+
28
+ def size_class
29
+ size == "none" ? nil : size
15
30
  end
16
31
  end
17
32
  end
@@ -17,7 +17,9 @@ type ListProps = {
17
17
  ordered: boolean,
18
18
  role?: string,
19
19
  tabIndex?: string,
20
+ text?: string,
20
21
  size?: string,
22
+ variant?: string,
21
23
  xpadding: boolean,
22
24
  }
23
25
 
@@ -36,6 +38,8 @@ const List = (props: ListProps) => {
36
38
  size = '',
37
39
  tabIndex,
38
40
  xpadding = false,
41
+ variant,
42
+ text,
39
43
  } = props
40
44
 
41
45
  const layoutClass = {
@@ -44,6 +48,9 @@ const List = (props: ListProps) => {
44
48
  default: '',
45
49
  }
46
50
 
51
+ const childrenWithProps = React.Children.map(children, (child) => {
52
+ return React.cloneElement(child, { text, variant })
53
+ })
47
54
  const ariaProps = buildAriaProps(aria)
48
55
  const dataProps = buildDataProps(data)
49
56
  const classes = classnames(
@@ -70,7 +77,7 @@ const List = (props: ListProps) => {
70
77
  role={role}
71
78
  tabIndex={tabIndex}
72
79
  >
73
- {children}
80
+ {childrenWithProps}
74
81
  </ol>
75
82
  <Else />
76
83
  <ul
@@ -81,7 +88,7 @@ const List = (props: ListProps) => {
81
88
  role={role}
82
89
  tabIndex={tabIndex}
83
90
  >
84
- {children}
91
+ {childrenWithProps}
85
92
  </ul>
86
93
  </If>
87
94
  </div>
@@ -0,0 +1,27 @@
1
+ <div class="pb--doc-demo-row">
2
+
3
+ <%= pb_rails("selectable_card", props: {
4
+ input_id: "selectable-image-default",
5
+ name: "selectable-image-default",
6
+ value: "selectable-image-default",
7
+ checked: true,
8
+ icon: true
9
+ }) do %>
10
+ <%= pb_rails("image", props: { rounded: true, size: "xl",url: "https://unsplash.it/500/400/?image=634" }) %>
11
+ <%= pb_rails("body", props: { tag: "span"}) do %>
12
+ Add text here
13
+ <% end %>
14
+
15
+ <% end %>
16
+
17
+ <%= pb_rails("selectable_card", props: {
18
+ input_id: "selectable-image-xl",
19
+ name: "selectable-image-xl",
20
+ value: "selectable-image-xl",
21
+ checked: false,
22
+ icon: true
23
+ }) do %>
24
+ <%= pb_rails("image", props: { rounded: true, size: "xl", url: "https://unsplash.it/500/400/?image=634" }) %>
25
+ <% end %>
26
+
27
+ </div>
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+ import {
3
+ Body,
4
+ Image,
5
+ SelectableCard,
6
+ } from '../../'
7
+
8
+ class SelectableCardImage extends React.Component {
9
+ state = {
10
+ selectableImage: true,
11
+ unselectedImage: false,
12
+ }
13
+
14
+ handleSelect = (event) => {
15
+ this.setState({
16
+ [event.target.id]: event.target.checked,
17
+ })
18
+ }
19
+
20
+ render() {
21
+ return (
22
+ <div className="pb--doc-demo-row">
23
+
24
+ <SelectableCard
25
+ checked={this.state.selectableImage}
26
+ icon
27
+ inputId="selectableImage"
28
+ name="selectableImage"
29
+ onChange={this.handleSelect}
30
+ value="selectableImage"
31
+ >
32
+ <Image
33
+ rounded
34
+ size="xl"
35
+ url="https://unsplash.it/500/400/?image=634"
36
+ />
37
+
38
+ <Body>{'Add text here'}</Body>
39
+ </SelectableCard>
40
+
41
+ <SelectableCard
42
+ checked={this.state.unselectedImage}
43
+ icon
44
+ inputId="unselectedImage"
45
+ name="unselectedImage"
46
+ onChange={this.handleSelect}
47
+ value="unselectedImage"
48
+ >
49
+ <Image
50
+ rounded
51
+ size="xl"
52
+ url="https://unsplash.it/500/400/?image=634"
53
+ />
54
+ </SelectableCard>
55
+
56
+ </div>
57
+ )
58
+ }
59
+ }
60
+
61
+ export default SelectableCardImage
@@ -0,0 +1 @@
1
+ Selectable Cards can pass images with optional text.
@@ -5,9 +5,11 @@ examples:
5
5
  - selectable_card_single_select: Single Select
6
6
  - selectable_card_block: Block
7
7
  - selectable_card_options: With Options
8
+ - selectable_card_image: Image Example
8
9
 
9
10
 
10
11
  react:
11
12
  - selectable_card_default: Default
12
13
  - selectable_card_single_select: Single Select
13
14
  - selectable_card_block: Block
15
+ - selectable_card_image: Image Example
@@ -1,3 +1,4 @@
1
1
  export { default as SelectableCardDefault } from './_selectable_card_default.jsx'
2
2
  export { default as SelectableCardSingleSelect } from './_selectable_card_single_select.jsx'
3
3
  export { default as SelectableCardBlock } from './_selectable_card_block.jsx'
4
+ export { default as SelectableCardImage } from './_selectable_card_image.jsx'
@@ -0,0 +1,90 @@
1
+ /* @flow */
2
+ import React, { Node } from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps.js'
6
+ import { Checkbox, ListItem, Radio } from '..'
7
+
8
+ type SelectableListItemProps = {
9
+ aria?: object,
10
+ children: array<Node> | Node,
11
+ checked?: boolean,
12
+ className?: string,
13
+ data?: object,
14
+ defaultChecked?: boolean,
15
+ id?: string,
16
+ label?: string,
17
+ text?: string,
18
+ name?: string,
19
+ value?: string,
20
+ variant?: string,
21
+ onChange: (boolean)=>void,
22
+ }
23
+
24
+ const SelectableListItem = ({
25
+ aria = {},
26
+ checked = false,
27
+ children,
28
+ className,
29
+ data = {},
30
+ defaultChecked,
31
+ id,
32
+ label,
33
+ text = '',
34
+ name = '',
35
+ value = '',
36
+ variant = 'checkbox',
37
+ onChange = () => {},
38
+ ...props
39
+ }: SelectableListItemProps) => {
40
+ const ariaProps = buildAriaProps(aria)
41
+ const dataProps = buildDataProps(data)
42
+ const classes = classnames(
43
+ buildCss('pb_selectable_list_item_kit'),
44
+ globalProps(props),
45
+ className
46
+ )
47
+
48
+ return (
49
+ <ListItem {...props}>
50
+ <div
51
+ {...ariaProps}
52
+ {...dataProps}
53
+ className={classes}
54
+ >
55
+ <Choose>
56
+ <When condition={variant == 'checkbox'}>
57
+ <Checkbox
58
+ checked={checked}
59
+ id={id}
60
+ name={name}
61
+ onChange={onChange}
62
+ // eslint suppressor, text is needed to display on screen
63
+ text={label || (text && false)}
64
+ type="checkbox"
65
+ value={value}
66
+ {...props}
67
+ />
68
+ {children}
69
+ </When>
70
+ <When condition={variant == 'radio'}>
71
+ <Radio
72
+ defaultChecked={defaultChecked}
73
+ id={id}
74
+ label={label}
75
+ name={name}
76
+ onChange={onChange}
77
+ type="radio"
78
+ value={value}
79
+ {...props}
80
+ />
81
+ {children}
82
+ </When>
83
+ <Otherwise>{children}</Otherwise>
84
+ </Choose>
85
+ </div>
86
+ </ListItem>
87
+ )
88
+ }
89
+
90
+ export default SelectableListItem