playbook_ui 4.18.1.pre.alpha1 → 5.0.2

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/helpers/playbook/pb_sample_helper.rb +1 -1
  4. data/app/pb_kits/playbook/_playbook.scss +1 -1
  5. data/app/pb_kits/playbook/data/menu.yml +3 -1
  6. data/app/pb_kits/playbook/packs/examples.js +2 -0
  7. data/app/pb_kits/playbook/packs/samples.js +2 -0
  8. data/app/pb_kits/playbook/pb_caption/_caption.jsx +21 -4
  9. data/app/pb_kits/playbook/pb_card/_card.scss +1 -72
  10. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +72 -0
  11. data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +0 -1
  12. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.jsx +1 -1
  13. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +1 -1
  14. data/app/pb_kits/playbook/pb_installer/_installer.html.erb +16 -0
  15. data/app/pb_kits/playbook/pb_installer/_installer.jsx +54 -0
  16. data/app/pb_kits/playbook/pb_installer/_installer.scss +7 -0
  17. data/app/pb_kits/playbook/pb_installer/docs/_installer_default.html.erb +8 -0
  18. data/app/pb_kits/playbook/pb_installer/docs/_installer_default.jsx +16 -0
  19. data/app/pb_kits/playbook/pb_installer/docs/example.yml +9 -0
  20. data/app/pb_kits/playbook/pb_installer/docs/index.js +1 -0
  21. data/app/pb_kits/playbook/pb_installer/installer.rb +18 -0
  22. data/app/pb_kits/playbook/pb_layout/_body.html.erb +1 -1
  23. data/app/pb_kits/playbook/pb_layout/_column.html.erb +7 -0
  24. data/app/pb_kits/playbook/pb_layout/_layout.jsx +31 -13
  25. data/app/pb_kits/playbook/pb_layout/_layout.scss +54 -0
  26. data/app/pb_kits/playbook/pb_layout/body.rb +4 -0
  27. data/app/pb_kits/playbook/pb_layout/docs/_layout_kanban.html.erb +140 -0
  28. data/app/pb_kits/playbook/pb_layout/docs/_layout_kanban.jsx +1234 -0
  29. data/app/pb_kits/playbook/pb_layout/docs/_layout_kanban_responsive.html.erb +57 -0
  30. data/app/pb_kits/playbook/pb_layout/docs/_layout_kanban_responsive.jsx +46 -0
  31. data/app/pb_kits/playbook/pb_layout/docs/example.yml +3 -0
  32. data/app/pb_kits/playbook/pb_layout/docs/index.js +2 -0
  33. data/app/pb_kits/playbook/pb_layout/layout.rb +12 -4
  34. data/app/pb_kits/playbook/pb_list/_item.html.erb +3 -2
  35. data/app/pb_kits/playbook/pb_list/_list.html.erb +3 -3
  36. data/app/pb_kits/playbook/pb_list/_list.jsx +55 -10
  37. data/app/pb_kits/playbook/pb_list/_list_item.jsx +41 -18
  38. data/app/pb_kits/playbook/pb_list/docs/_list_borderless.jsx +21 -0
  39. data/app/pb_kits/playbook/pb_list/docs/_list_dark.jsx +0 -5
  40. data/app/pb_kits/playbook/pb_list/docs/_list_dark_borderless.jsx +22 -0
  41. data/app/pb_kits/playbook/pb_list/docs/_list_dark_lg.jsx +22 -0
  42. data/app/pb_kits/playbook/pb_list/docs/_list_dark_ordered.jsx +22 -0
  43. data/app/pb_kits/playbook/pb_list/docs/_list_dark_xpadding.jsx +22 -0
  44. data/app/pb_kits/playbook/pb_list/docs/_list_layout_left.jsx +75 -0
  45. data/app/pb_kits/playbook/pb_list/docs/_list_layout_right.jsx +75 -0
  46. data/app/pb_kits/playbook/pb_list/docs/_list_lg.jsx +21 -0
  47. data/app/pb_kits/playbook/pb_list/docs/_list_ordered.jsx +21 -0
  48. data/app/pb_kits/playbook/pb_list/docs/_list_xpadding.jsx +21 -0
  49. data/app/pb_kits/playbook/pb_list/docs/example.yml +12 -1
  50. data/app/pb_kits/playbook/pb_list/docs/index.js +11 -0
  51. data/app/pb_kits/playbook/pb_popover/_popover.html.erb +4 -4
  52. data/app/pb_kits/playbook/pb_popover/_popover.jsx +41 -8
  53. data/app/pb_kits/playbook/pb_popover/_popover.scss +44 -7
  54. data/app/pb_kits/playbook/pb_popover/docs/_popover_close.html.erb +42 -0
  55. data/app/pb_kits/playbook/pb_popover/docs/_popover_close.jsx +99 -0
  56. data/app/pb_kits/playbook/pb_popover/docs/_popover_default.html.erb +19 -7
  57. data/app/pb_kits/playbook/pb_popover/docs/_popover_default.jsx +22 -6
  58. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.html.erb +11 -10
  59. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.jsx +22 -18
  60. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.md +1 -0
  61. data/app/pb_kits/playbook/pb_popover/docs/_popover_scroll_height.html.erb +24 -0
  62. data/app/pb_kits/playbook/pb_popover/docs/_popover_scroll_height.jsx +56 -0
  63. data/app/pb_kits/playbook/pb_popover/docs/_popover_z_index.html.erb +14 -0
  64. data/app/pb_kits/playbook/pb_popover/docs/_popover_z_index.jsx +50 -0
  65. data/app/pb_kits/playbook/pb_popover/docs/example.yml +12 -8
  66. data/app/pb_kits/playbook/pb_popover/docs/index.js +3 -3
  67. data/app/pb_kits/playbook/pb_popover/index.js +18 -9
  68. data/app/pb_kits/playbook/pb_popover/popover.rb +26 -2
  69. data/app/pb_kits/playbook/pb_title/_title.html.erb +1 -0
  70. data/app/pb_kits/playbook/pb_title/_title.jsx +24 -17
  71. data/app/pb_kits/playbook/props.rb +7 -0
  72. data/app/views/playbook/samples/filter_table/index.html.erb +348 -0
  73. data/app/views/playbook/samples/filter_table/index.jsx +433 -0
  74. data/lib/playbook/version.rb +1 -1
  75. metadata +37 -12
  76. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_any.html.erb +0 -19
  77. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_any.jsx +0 -40
  78. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.html.erb +0 -14
  79. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.jsx +0 -40
  80. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.html.erb +0 -14
  81. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.jsx +0 -40
  82. data/app/pb_kits/playbook/pb_popover/docs/_popover_with_button.jsx +0 -34
  83. data/app/pb_kits/playbook/pb_popover/docs/_popover_with_circle.html.erb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2089dad07588097cb7bf94e0c7915a97e1bcf3f2029c3dc8d77036ea6de0a74b
4
- data.tar.gz: 767d1abd51a803e43d216ef1946b82b235f5c7a28fe5b1a3f38e245fff9e8918
3
+ metadata.gz: d2d56f651849112f219a822c91acbb3509875e03014444c1f4e93dc9f3507d6f
4
+ data.tar.gz: 98afd071a855e8eff49ea47f56170e219ca3db69f167cadcb5e704fc7f8dc0da
5
5
  SHA512:
6
- metadata.gz: be7cf9f4ee8c126aeb48d3ff48f4b8e2c858eb0fb997c1bd8e29d44207369535808fd6711d456f9b5996d6b874662d4f16d86c8efbac033d3e45f6ac147f6006
7
- data.tar.gz: e0ef0655b2b2c516b496f102410247859530f5b4f7e6f5d535aa1dff15cf911ad216e26c7faf9d8b72a113cd9482d60f5d89ef325aa597f3dac3651a2ceffbce
6
+ metadata.gz: e55b3425c7341be74aef73641a5972435ea67cfc2fa80b6df50db89b8b13936dd17f2c535a0c9914153da59e2935f11dedceabde3000794b9581dcd8afb16e56
7
+ data.tar.gz: 9a1eefdce2a9528175c4272b80b05addd29307f0254a691402ca84b70b5dcb05c85cdc81f94ac5a8a12c3fb5c3965fec0066328750a3e252d7dc7dcb9e13c160
data/README.md CHANGED
@@ -9,10 +9,10 @@ Playbook is the first design system built for both Rails & React interfaces. Ins
9
9
 
10
10
  ## Getting started
11
11
 
12
- 1. Run `yarn && bundle`
12
+ 1. Run `make install`
13
13
  1. Run `make start`
14
14
  1. Install overcommit hooks `bin/overcommit`
15
- 1. open [http://localhost:8080](http://localhost:8080)
15
+ 1. open [http://localhost:8089](http://localhost:8089)
16
16
 
17
17
  To clean up this project from your local machine, run `make stop`, which will drop all containers and networks associated with this project. To purge all resources, do `make clean`, which also removes images and volumes for a blank slate.
18
18
 
@@ -49,7 +49,7 @@ module Playbook
49
49
  if type == "rails"
50
50
  render template: "playbook/samples/#{sample}/index.html.erb"
51
51
  elsif type == "react"
52
- react_component(sample.titleize.to_s)
52
+ react_component(sample.titleize.delete(" ").to_s)
53
53
  end
54
54
  end
55
55
  end
@@ -33,6 +33,7 @@
33
33
  @import 'pb_icon_circle/icon_circle';
34
34
  @import 'pb_icon_value/icon_value';
35
35
  @import 'pb_image/image';
36
+ @import 'pb_installer/installer';
36
37
  @import 'pb_label_pill/label_pill';
37
38
  @import 'pb_label_value/label_value';
38
39
  @import 'pb_layout/layout';
@@ -80,4 +81,3 @@
80
81
  @import 'pb_time_stacked/time_stacked';
81
82
  @import 'pb_weekday_stacked/weekday_stacked';
82
83
  @import './utilities/spacing';
83
-
@@ -1,6 +1,8 @@
1
1
  samples:
2
2
  - dashboards
3
3
  - registration
4
+ - filter_table
5
+
4
6
  kits:
5
7
  - avatar
6
8
  - avatar_action_button
@@ -39,6 +41,7 @@ kits:
39
41
  - icon_circle
40
42
  - icon_value
41
43
  - image
44
+ - installer
42
45
  - layout
43
46
  - list
44
47
  - loading_inline
@@ -88,4 +91,3 @@ kits:
88
91
  - title_detail
89
92
  - weekday_stacked
90
93
  - user
91
- - user_badge
@@ -45,6 +45,7 @@ import * as Icon from 'pb_icon/docs'
45
45
  import * as IconCircle from 'pb_icon_circle/docs'
46
46
  import * as IconValue from 'pb_icon_value/docs'
47
47
  import * as Image from 'pb_image/docs'
48
+ import * as Installer from 'pb_installer/docs'
48
49
  import * as LabelPill from 'pb_label_pill/docs'
49
50
  import * as LabelValue from 'pb_label_value/docs'
50
51
  import * as Layout from 'pb_layout/docs'
@@ -124,6 +125,7 @@ WebpackerReact.setup({
124
125
  ...IconCircle,
125
126
  ...IconValue,
126
127
  ...Image,
128
+ ...Installer,
127
129
  ...LabelPill,
128
130
  ...LabelValue,
129
131
  ...Layout,
@@ -11,7 +11,9 @@ import WebpackerReact from 'webpacker-react'
11
11
  // Generated file from kit generator.
12
12
 
13
13
  import Dashboards from '../../../views/playbook/samples/dashboards/index.jsx'
14
+
14
15
  import Registration from '../../../views/playbook/samples/registration/index.jsx'
15
16
 
16
17
  WebpackerReact.setup({ Dashboards })
18
+ WebpackerReact.setup({ FilterTable })
17
19
  WebpackerReact.setup({ Registration })
@@ -2,29 +2,37 @@
2
2
 
3
3
  import React from 'react'
4
4
  import classnames from 'classnames'
5
- import { buildCss } from '../utilities/props'
5
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
6
  import { spacing } from '../utilities/spacing.js'
7
7
 
8
8
  type CaptionProps = {
9
+ aria?: object,
9
10
  className?: String,
10
11
  children: Array<React.ReactNode> | React.ReactNode,
11
12
  dark?: Boolean,
13
+ data?: object,
14
+ id?: String,
12
15
  size?: "xs" | "sm" | "md" | "lg" | "xl",
13
- tag: String,
14
- text: String,
16
+ tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "div",
17
+ text?: String,
15
18
  }
16
19
 
17
20
  const Caption = (props: CaptionProps) => {
18
21
  const {
22
+ aria = {},
19
23
  className,
20
24
  children,
21
25
  dark = false,
26
+ data = {},
27
+ id,
22
28
  size = 'md',
23
29
  tag = 'div',
24
30
  text,
25
31
  } = props
26
32
  const Tag = `${tag}`
27
33
 
34
+ const ariaProps = buildAriaProps(aria)
35
+ const dataProps = buildDataProps(data)
28
36
  const css = classnames(
29
37
  buildCss('pb_caption_kit', size, {
30
38
  dark: dark,
@@ -33,7 +41,16 @@ const Caption = (props: CaptionProps) => {
33
41
  spacing(props)
34
42
  )
35
43
 
36
- return <Tag className={css}>{text || children}</Tag>
44
+ return (
45
+ <Tag
46
+ {...ariaProps}
47
+ {...dataProps}
48
+ className={css}
49
+ id={id}
50
+ >
51
+ {text || children}
52
+ </Tag>
53
+ )
37
54
  }
38
55
 
39
56
  export default Caption
@@ -1,75 +1,4 @@
1
- @import "../tokens/shadows";
2
- @import "../tokens/border_radius";
3
- @import "../tokens/spacing";
4
- @import "../tokens/colors";
5
- @import "../tokens/transition";
6
- @import "../tokens/animation-curves";
7
-
8
- $pb_card_border_width: 1px;
9
- $pb_card_border_radius: $border_rad_heavier;
10
- $pb_card_highlight_colors: map-merge(map-merge($status_colors, $product_colors), $category_colors);
11
- $pb_card_highlight_size: 4px;
12
- $pb_card_header_colors: $category_colors;
13
- $pb_card_header_border_radius: $border_rad_heavy;
14
- $pb_card_padding:(
15
- none: 0,
16
- xs: $space_xs,
17
- sm: $space_sm,
18
- md: $space_md,
19
- lg: $space_lg,
20
- xl: $space_xl,
21
- );
22
-
23
- @mixin pb_card_selected($border_color: $primary) {
24
- border-color: $border_color;
25
- border-width: $pb_card_border_width * 2;
26
- }
27
-
28
- @mixin pb_card_selected_dark {
29
- @include pb_card_selected($primary_action);
30
- }
31
-
32
- @mixin pb_card($background: $card_light, $border_color: $border_light) {
33
- position: relative;
34
- display: flex;
35
- flex-direction: column;
36
- min-width: 0;
37
- word-wrap: break-word;
38
- background-color: $background;
39
- background-clip: border-box;
40
- border-width: $pb_card_border_width;
41
- border-style: solid;
42
- border-color: $border_color;
43
- border-radius: $pb_card_border_radius;
44
- transition-property: all;
45
- transition-duration: $transition_short;
46
- transition-timing-function: $easeIn;
47
-
48
- @each $name, $shadow in $box_shadows {
49
- &[class*=_#{$name}] {
50
- box-shadow: $shadow;
51
- }
52
- }
53
- }
54
-
55
- @mixin pb_card_dark {
56
- @include pb_card($card_dark, $border_dark);
57
- }
58
-
59
- @mixin pb_card_highlight($width, $height, $background){
60
- content: "";
61
- position: absolute;
62
- top: 0;
63
- left: 0;
64
- width: $width;
65
- height: $height;
66
- background: $background;
67
- z-index: 10;
68
- }
69
-
70
- @mixin pb_card_header_color($category_color) {
71
- background: $category_color;
72
- }
1
+ @import "card_mixin";
73
2
 
74
3
 
75
4
  [class^=pb_card_kit] {
@@ -0,0 +1,72 @@
1
+ @import "../tokens/shadows";
2
+ @import "../tokens/border_radius";
3
+ @import "../tokens/spacing";
4
+ @import "../tokens/colors";
5
+ @import "../tokens/transition";
6
+ @import "../tokens/animation-curves";
7
+
8
+ $pb_card_border_width: 1px;
9
+ $pb_card_border_radius: $border_rad_heavier;
10
+ $pb_card_highlight_colors: map-merge(map-merge($status_colors, $product_colors), $category_colors);
11
+ $pb_card_highlight_size: 4px;
12
+ $pb_card_header_colors: $category_colors;
13
+ $pb_card_header_border_radius: $border_rad_heavy;
14
+ $pb_card_padding:(
15
+ none: 0,
16
+ xs: $space_xs,
17
+ sm: $space_sm,
18
+ md: $space_md,
19
+ lg: $space_lg,
20
+ xl: $space_xl,
21
+ );
22
+
23
+ @mixin pb_card_selected($border_color: $primary) {
24
+ border-color: $border_color;
25
+ border-width: $pb_card_border_width * 2;
26
+ }
27
+
28
+ @mixin pb_card_selected_dark {
29
+ @include pb_card_selected($primary_action);
30
+ }
31
+
32
+ @mixin pb_card($background: $card_light, $border_color: $border_light) {
33
+ position: relative;
34
+ display: flex;
35
+ flex-direction: column;
36
+ min-width: 0;
37
+ word-wrap: break-word;
38
+ background-color: $background;
39
+ background-clip: border-box;
40
+ border-width: $pb_card_border_width;
41
+ border-style: solid;
42
+ border-color: $border_color;
43
+ border-radius: $pb_card_border_radius;
44
+ transition-property: all;
45
+ transition-duration: $transition_short;
46
+ transition-timing-function: $easeIn;
47
+
48
+ @each $name, $shadow in $box_shadows {
49
+ &[class*=_#{$name}] {
50
+ box-shadow: $shadow;
51
+ }
52
+ }
53
+ }
54
+
55
+ @mixin pb_card_dark {
56
+ @include pb_card($card_dark, $border_dark);
57
+ }
58
+
59
+ @mixin pb_card_highlight($width, $height, $background){
60
+ content: "";
61
+ position: absolute;
62
+ top: 0;
63
+ left: 0;
64
+ width: $width;
65
+ height: $height;
66
+ background: $background;
67
+ z-index: 10;
68
+ }
69
+
70
+ @mixin pb_card_header_color($category_color) {
71
+ background: $category_color;
72
+ }
@@ -21,7 +21,6 @@ const FiltersPopover = ({ children }: FiltersPopoverProps) => {
21
21
  return (
22
22
  <PbReactPopover
23
23
  closeOnClick="outside"
24
- offset
25
24
  placement="bottom"
26
25
  reference={filterButton}
27
26
  shouldClosePopover={updateHide}
@@ -69,7 +69,7 @@ const SortMenu = ({ options, value, onChange }: SortMenuProps) => {
69
69
  <PbReactPopover
70
70
  className="pb_filter_sort_menu"
71
71
  closeOnClick="outside"
72
- offset
72
+ padding="none"
73
73
  placement="bottom"
74
74
  reference={sortButton}
75
75
  shouldClosePopover={updateHide}
@@ -13,7 +13,7 @@
13
13
  <%end%>
14
14
 
15
15
  <% if object.template != "filter_only"%>
16
- <%= pb_rails("popover", props: {classname: "pb_filter_sort_menu", close_on_click: "outside", trigger_element_id: "sort-button#{object.id}", tooltip_id: "sort-filter-btn-tooltip#{object.id}", position: 'bottom'}) do %>
16
+ <%= pb_rails("popover", props: {classname: "pb_filter_sort_menu", close_on_click: "outside", trigger_element_id: "sort-button#{object.id}", tooltip_id: "sort-filter-btn-tooltip#{object.id}", position: 'bottom', padding: 'none'}) do %>
17
17
  <%= pb_rails("list") do %>
18
18
  <% object.sort_menu.each do |item| %>
19
19
  <%= pb_rails("list/item") do%> <%= pb_rails("button", props: {variant: "link" ,classname: "p-0", text: item[:item], link: item[:link]}) %><% end %>
@@ -0,0 +1,16 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname) do %>
5
+ <%= pb_rails("body", props: {color: "light" }) do %>
6
+ <%= pb_rails("caption", props: { text: "Installer" }) %>
7
+ <%= pb_rails("icon", props: { icon: "truck", fixed_width: true }) %>
8
+ <% if object.link %>
9
+ <%= link_to object.link, class: "pb_installer_kit_links" do %>
10
+ <%= pb_rails("title", props: { text: object.project_name, tag: "span", size: 4 }) %>
11
+ <% end %>
12
+ <% else %>
13
+ <%= pb_rails("title", props: { text: object.project_name, tag: "span", size: 4 }) %>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
@@ -0,0 +1,54 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import classnames from 'classnames'
5
+ import { Body, Caption, Icon, Title } from '../'
6
+
7
+ const renderProjectName = (link, projectName) => {
8
+ if (link) {
9
+ return (
10
+ <a
11
+ className="pb_installer_kit_links"
12
+ href={link}
13
+ >
14
+ <Title
15
+ size={4}
16
+ tag="span"
17
+ text={projectName}
18
+ />
19
+ </a>
20
+ )
21
+ }
22
+
23
+ return (
24
+ <Title
25
+ size={4}
26
+ tag="span"
27
+ text={projectName}
28
+ />
29
+ )
30
+ }
31
+
32
+ type InstallerProps = {
33
+ link?: String,
34
+ projectName: String,
35
+ }
36
+
37
+ const Installer = ({
38
+ link,
39
+ projectName,
40
+ }: InstallerProps) => (
41
+ <div className={classnames('pb_installer_kit')}>
42
+ <Body color="light">
43
+ <Caption text="Installer" />
44
+ <Icon
45
+ fixedwidth
46
+ icon="truck"
47
+ />
48
+ {' '}
49
+ {renderProjectName(link, projectName)}
50
+ </Body>
51
+ </div>
52
+ )
53
+
54
+ export default Installer
@@ -0,0 +1,7 @@
1
+ [class^=pb_installer_kit] {
2
+ .pb_installer_kit_links {
3
+ span {
4
+ color: $data_1;
5
+ }
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ <%= pb_rails("installer", props: {
2
+ project_name: "JD Installations LLC"
3
+ }) %>
4
+ <br /><br />
5
+ <%= pb_rails("installer", props: {
6
+ link: "#",
7
+ project_name: "JD Installations LLC"
8
+ }) %>
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import Installer from '../_installer.jsx'
3
+
4
+ const InstallerDefault = () => (
5
+ <div>
6
+ <Installer projectName="JD Installations LLC" />
7
+ <br />
8
+ <br />
9
+ <Installer
10
+ link="#"
11
+ projectName="JD Installations LLC"
12
+ />
13
+ </div>
14
+ )
15
+
16
+ export default InstallerDefault
@@ -0,0 +1,9 @@
1
+ examples:
2
+
3
+ rails:
4
+ - installer_default: Default
5
+
6
+
7
+ react:
8
+ - installer_default: Default
9
+