playbook_ui 14.4.0.pre.rc.14 → 14.4.0.pre.rc.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +245 -23
  3. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +1 -1
  4. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.html.erb +117 -0
  5. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.jsx +227 -0
  6. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.md +1 -0
  7. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  8. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  9. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +1 -1
  10. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +5 -1
  11. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +72 -0
  12. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +91 -0
  13. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_rails.md +1 -0
  14. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_react.md +1 -0
  15. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  16. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  17. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +4 -0
  18. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +97 -21
  19. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.test.js +166 -0
  20. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +45 -6
  21. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.html.erb +73 -0
  22. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.jsx +86 -0
  23. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/example.yml +2 -0
  24. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +6 -2
  26. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.rb +21 -1
  27. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +16 -0
  28. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +4 -0
  29. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +26 -18
  30. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +31 -0
  31. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +26 -0
  32. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_rails.md +1 -0
  33. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_react.md +1 -0
  34. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  35. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  36. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +4 -0
  37. data/app/pb_kits/playbook/tokens/_colors.scss +2 -0
  38. data/dist/chunks/{_typeahead-BAFhtQtP.js → _typeahead-B2zRxReA.js} +2 -2
  39. data/dist/chunks/{_weekday_stacked-V_fGN_e4.js → _weekday_stacked-Co95UEiW.js} +2 -2
  40. data/dist/chunks/{lib--ErPKv63.js → lib-D2U4I1U6.js} +1 -1
  41. data/dist/chunks/{pb_form_validation-CHMFwDfe.js → pb_form_validation-zV9OpdSt.js} +1 -1
  42. data/dist/chunks/vendor.js +1 -1
  43. data/dist/playbook-doc.js +1 -1
  44. data/dist/playbook-rails-react-bindings.js +1 -1
  45. data/dist/playbook-rails.js +1 -1
  46. data/dist/playbook.css +1 -1
  47. data/lib/playbook/version.rb +1 -1
  48. metadata +18 -5
@@ -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
@@ -107,4 +107,20 @@ test('should pass className prop', () => {
107
107
 
108
108
  const kit = screen.getByTestId('typeahead-test')
109
109
  expect(kit).toHaveClass(className)
110
+ })
111
+
112
+ test('typeahead with colored pills', () => {
113
+ render(
114
+ <Typeahead
115
+ data={{ testid: 'pills-color-test' }}
116
+ defaultValue={[options[0]]}
117
+ isMulti
118
+ options={options}
119
+ pillColor="neutral"
120
+ />
121
+ )
122
+
123
+ const kit = screen.getByTestId('pills-color-test')
124
+ const pill = kit.querySelector(".pb_form_pill_kit_neutral")
125
+ expect(pill).toBeInTheDocument()
110
126
  })
@@ -45,12 +45,14 @@ type TypeaheadProps = {
45
45
  getOptionLabel?: string | (() => any),
46
46
  getOptionValue?: string | (() => any),
47
47
  name?: string,
48
+ pillColor?: "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",
48
49
  } & GlobalProps
49
50
 
50
51
  export type SelectValueType = {
51
52
  label: string,
52
53
  value: string,
53
54
  imageUrl?: string,
55
+ pillColor?: string,
54
56
  }
55
57
 
56
58
  type TagOnChangeValues = {
@@ -76,6 +78,7 @@ const Typeahead = ({
76
78
  htmlOptions = {},
77
79
  id,
78
80
  loadOptions = noop,
81
+ pillColor,
79
82
  ...props
80
83
  }: TypeaheadProps) => {
81
84
  const selectProps = {
@@ -105,6 +108,7 @@ const Typeahead = ({
105
108
  onCreateOption: null as null,
106
109
  plusIcon: false,
107
110
  onMultiValueClick: (_option: SelectValueType): any => undefined,
111
+ pillColor: pillColor,
108
112
  ...props,
109
113
  }
110
114
 
@@ -8,6 +8,7 @@ import { SelectValueType } from '../_typeahead'
8
8
  type Props = {
9
9
  data: SelectValueType,
10
10
  multiValueTemplate: any,
11
+ pillColor?: "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",
11
12
  removeProps: any,
12
13
  selectProps: any,
13
14
  }
@@ -15,48 +16,55 @@ type Props = {
15
16
  const MultiValue = (props: Props) => {
16
17
  const { removeProps } = props
17
18
  const { imageUrl, label } = props.data
18
- const { multiKit } = props.selectProps
19
+ const { dark, multiKit, pillColor } = props.selectProps
19
20
 
20
21
  const formPillProps = {
21
22
  marginRight: 'xs',
22
23
  name: label,
23
24
  avatarUrl: '',
25
+ dark,
24
26
  }
25
27
 
26
28
  if (typeof imageUrl === 'string') formPillProps.avatarUrl = imageUrl
27
29
 
28
30
  return (
29
31
  <components.MultiValueContainer
30
- className="text_input_multivalue_container"
31
- {...props}
32
+ className="text_input_multivalue_container"
33
+ {...props}
32
34
  >
33
35
  {multiKit === 'badge' &&
34
36
  <Badge
35
- closeProps={removeProps}
36
- removeIcon
37
- text={label}
38
- variant="primary"
37
+ closeProps={removeProps}
38
+ removeIcon
39
+ text={label}
40
+ variant="primary"
39
41
  />
40
42
  }
41
43
 
42
44
  {multiKit !== 'badge' && imageUrl &&
43
45
  <FormPill
44
- avatarUrl={imageUrl}
45
- closeProps={removeProps}
46
- marginRight="xs"
47
- name={label}
48
- size={multiKit === 'smallPill' ? 'small' : ''}
49
- text=''
46
+ avatarUrl={imageUrl}
47
+ closeProps={removeProps}
48
+ color={pillColor}
49
+ dark={dark}
50
+ marginRight="xs"
51
+ name={label}
52
+ size={multiKit === 'smallPill' ? 'small' : ''}
53
+ text=''
54
+ {...props}
50
55
  />
51
56
  }
52
57
 
53
58
  {multiKit !== 'badge' && !imageUrl &&
54
59
  <FormPill
55
- closeProps={removeProps}
56
- marginRight="xs"
57
- name=''
58
- size={multiKit === 'smallPill' ? 'small' : ''}
59
- text={label}
60
+ closeProps={removeProps}
61
+ color={pillColor}
62
+ dark={dark}
63
+ marginRight="xs"
64
+ name=''
65
+ size={multiKit === 'smallPill' ? 'small' : ''}
66
+ text={label}
67
+ {...props}
60
68
  />
61
69
  }
62
70
  </components.MultiValueContainer>
@@ -0,0 +1,31 @@
1
+ <%
2
+ options = [
3
+ { label: 'Windows', value: '#FFA500' },
4
+ { label: 'Siding', value: '#FF0000' },
5
+ { label: 'Doors', value: '#00FF00' },
6
+ { label: 'Roofs', value: '#0000FF' },
7
+ ]
8
+ %>
9
+
10
+ <%= pb_rails("typeahead", props: { id: "typeahead-pills-example1", pill_color: "neutral", default_options: [options.first], options: options, label: "Colors", name: :foo, pills: true }) %>
11
+
12
+ <%= pb_rails("button", props: {id: "clear-pills", text: "Clear All Options", variant: "secondary"}) %>
13
+
14
+ <!-- This section is an example of the available JavaScript event hooks -->
15
+ <%= javascript_tag defer: "defer" do %>
16
+ document.addEventListener("pb-typeahead-kit-typeahead-pills-example1-result-option-select", function(event) {
17
+ console.log('Option selected')
18
+ console.dir(event.detail)
19
+ })
20
+ document.addEventListener("pb-typeahead-kit-typeahead-pills-example1-result-option-remove", function(event) {
21
+ console.log('Option removed')
22
+ console.dir(event.detail)
23
+ })
24
+ document.addEventListener("pb-typeahead-kit-typeahead-pills-example1-result-clear", function() {
25
+ console.log('All options cleared')
26
+ })
27
+
28
+ document.querySelector('#clear-pills').addEventListener('click', function() {
29
+ document.dispatchEvent(new CustomEvent('pb-typeahead-kit-typeahead-pills-example1:clear'))
30
+ })
31
+ <% end %>
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { Typeahead } from 'playbook-ui'
3
+
4
+ const options = [
5
+ { label: 'Windows', value: '#FFA500' },
6
+ { label: 'Siding', value: '#FF0000' },
7
+ { label: 'Doors', value: '#00FF00' },
8
+ { label: 'Roofs', value: '#0000FF' },
9
+ ]
10
+
11
+ const TypeaheadWithPills = (props) => {
12
+ return (
13
+ <>
14
+ <Typeahead
15
+ isMulti
16
+ label="Colors"
17
+ options={options}
18
+ pillColor="neutral"
19
+ placeholder=""
20
+ {...props}
21
+ />
22
+ </>
23
+ )
24
+ }
25
+
26
+ export default TypeaheadWithPills
@@ -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.
@@ -9,6 +9,7 @@ examples:
9
9
  - typeahead_inline: Inline
10
10
  - typeahead_multi_kit: Multi Kit Options
11
11
  - typeahead_error_state: Error State
12
+ - typeahead_with_pills_color: With Pills (Custom Color)
12
13
 
13
14
  react:
14
15
  - typeahead_default: Default
@@ -23,3 +24,4 @@ examples:
23
24
  - typeahead_async_createable: Createable (+ Async Data)
24
25
  - typeahead_error_state: Error State
25
26
  - typeahead_custom_menu_list: Custom MenuList
27
+ - typeahead_with_pills_color: With Pills (Custom Color)
@@ -10,3 +10,4 @@ export { default as TypeaheadCreateable } from './_typeahead_createable.jsx'
10
10
  export { default as TypeaheadAsyncCreateable } from './_typeahead_async_createable.jsx'
11
11
  export { default as TypeaheadErrorState } from './_typeahead_error_state.jsx'
12
12
  export { default as TypeaheadCustomMenuList } from './_typeahead_custom_menu_list.jsx'
13
+ export { default as TypeaheadWithPillsColor } from './_typeahead_with_pills_color.jsx'
@@ -34,6 +34,9 @@ module Playbook
34
34
  prop :search_term_minimum_length, default: 3
35
35
  prop :search_debounce_timeout, default: 250
36
36
  prop :value
37
+ prop :pill_color, type: Playbook::Props::Enum,
38
+ 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],
39
+ default: "primary"
37
40
 
38
41
  def classname
39
42
  generate_classname("pb_typeahead_kit")
@@ -58,6 +61,7 @@ module Playbook
58
61
  def typeahead_react_options
59
62
  base_options = {
60
63
  className: classname,
64
+ pillColor: pill_color,
61
65
  dark: dark,
62
66
  defaultValue: default_options,
63
67
  error: error,
@@ -259,6 +259,7 @@ $solar: $product_4_background !default; // deprecated
259
259
  $roofing: $product_5_background !default; // deprecated
260
260
  $gutters: $product_6_background !default; // deprecated
261
261
  $insulation: $product_7_background !default; // deprecated
262
+ $accessories: $product_8_background !default; // added specifically for form_pill product map
262
263
  $product_colors: (
263
264
  windows: $windows,
264
265
  siding: $siding,
@@ -267,6 +268,7 @@ $product_colors: (
267
268
  roofing: $roofing,
268
269
  gutters: $gutters,
269
270
  insulation: $insulation,
271
+ accessories: $accessories,
270
272
  product_1_background: $product_1_background,
271
273
  product_1_highlight: $product_1_highlight,
272
274
  product_2_background: $product_2_background,