playbook_ui 14.6.0 → 14.6.2.pre.alpha.PLAY1485selectablecardoverflowoutlinebug4247
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_card/_card.tsx +1 -5
- data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -2
- data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +1 -5
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +4 -4
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +1 -3
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +1 -1
- data/app/pb_kits/playbook/pb_flex/_flex.tsx +1 -3
- data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +2 -8
- data/app/pb_kits/playbook/pb_flex/flex_item.html.erb +6 -3
- data/app/pb_kits/playbook/pb_flex/flex_item.rb +2 -7
- data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +67 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.tsx +1 -0
- data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/selectable_card.rb +5 -1
- data/app/pb_kits/playbook/utilities/globalPropNames.mjs +0 -3
- data/app/pb_kits/playbook/utilities/globalProps.ts +2 -39
- data/dist/chunks/_typeahead-BV_n6U5W.js +22 -0
- data/dist/chunks/{_weekday_stacked-C_QAqbqJ.js → _weekday_stacked-Cyqgh5-q.js} +2 -2
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/kit_base.rb +1 -21
- data/lib/playbook/version.rb +2 -2
- metadata +7 -7
- data/dist/chunks/_typeahead-BhHnXJjy.js +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0896cae36211162e8819470663f9dedb1716254cd40cb3a59c20caafd4d23b2d'
|
4
|
+
data.tar.gz: 713356bd680806bce64921cdcdd51e74e562b79b9cee92bff6b7d2ef4602e436
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41b0df84cd4c1c54944f10026c6fb846bf9cff9016a376750c904321c40b0f7f16a4bf7372078f5d8a8d1f2048766c0726aabf89da3c0db5e79a2f41ecdb62b9
|
7
|
+
data.tar.gz: 92d6d3a078efc32f7de1cff32648381ac14d1bf74ff33ea749ca9fd50d61f5991a2a5a4a9661fb2c50688c6df4880ee34f78dd631882e973abec6b43d805d7a4
|
@@ -5,7 +5,7 @@ import { get } from 'lodash'
|
|
5
5
|
import classnames from 'classnames'
|
6
6
|
|
7
7
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
|
8
|
-
import { GlobalProps, globalProps
|
8
|
+
import { GlobalProps, globalProps } from '../utilities/globalProps'
|
9
9
|
import type { ProductColors, CategoryColors, BackgroundColors } from '../types/colors'
|
10
10
|
|
11
11
|
import Icon from '../pb_icon/_icon'
|
@@ -49,7 +49,6 @@ type CardBodyProps = {
|
|
49
49
|
padding?: string,
|
50
50
|
} & GlobalProps
|
51
51
|
|
52
|
-
|
53
52
|
// Header component
|
54
53
|
const Header = (props: CardHeaderProps) => {
|
55
54
|
const { children, className, headerColor = 'category_1', headerColorStriped = false } = props
|
@@ -108,7 +107,6 @@ const Card = (props: CardPropTypes): React.ReactElement => {
|
|
108
107
|
|
109
108
|
// coerce to array
|
110
109
|
const cardChildren = React.Children.toArray(children)
|
111
|
-
const dynamicInlineProps = globalInlineProps(props);
|
112
110
|
|
113
111
|
const subComponentTags = (tagName: string) => {
|
114
112
|
return cardChildren.filter((c: string) => (
|
@@ -137,7 +135,6 @@ const Card = (props: CardPropTypes): React.ReactElement => {
|
|
137
135
|
{...dataProps}
|
138
136
|
{...htmlProps}
|
139
137
|
className={classnames(cardCss, globalProps(props), className)}
|
140
|
-
style={dynamicInlineProps}
|
141
138
|
>
|
142
139
|
{subComponentTags('Header')}
|
143
140
|
{
|
@@ -166,7 +163,6 @@ const Card = (props: CardPropTypes): React.ReactElement => {
|
|
166
163
|
{...dataProps}
|
167
164
|
{...htmlProps}
|
168
165
|
className={classnames(cardCss, globalProps(props), className)}
|
169
|
-
style={dynamicInlineProps}
|
170
166
|
>
|
171
167
|
{subComponentTags('Header')}
|
172
168
|
{nonHeaderChildren}
|
@@ -28,8 +28,7 @@ $pb_card_header_colors: map-merge(map-merge($product_colors, $additional_colors)
|
|
28
28
|
|
29
29
|
@mixin pb_card_selected($border_color: $primary) {
|
30
30
|
border-color: $border_color;
|
31
|
-
border-width: $pb_card_border_width;
|
32
|
-
outline: 1px solid $border_color;
|
31
|
+
border-width: $pb_card_border_width * 2;
|
33
32
|
}
|
34
33
|
|
35
34
|
@mixin pb_card_selected_dark {
|
@@ -6,7 +6,7 @@ import classnames from "classnames";
|
|
6
6
|
import Modal from "react-modal";
|
7
7
|
|
8
8
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
|
9
|
-
import { globalProps
|
9
|
+
import { globalProps } from "../utilities/globalProps";
|
10
10
|
|
11
11
|
import Body from "../pb_body/_body";
|
12
12
|
import Button from "../pb_button/_button";
|
@@ -91,8 +91,6 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
91
91
|
beforeClose: "pb_dialog_overlay_before_close",
|
92
92
|
};
|
93
93
|
|
94
|
-
const dynamicInlineProps = globalInlineProps(props);
|
95
|
-
|
96
94
|
const classes = classnames(
|
97
95
|
buildCss("pb_dialog_wrapper"),
|
98
96
|
globalProps(props),
|
@@ -186,7 +184,6 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
186
184
|
overlayClassName={overlayClassNames}
|
187
185
|
portalClassName={portalClassName}
|
188
186
|
shouldCloseOnOverlayClick={shouldCloseOnOverlayClick && !loading}
|
189
|
-
style={{ content: dynamicInlineProps }}
|
190
187
|
>
|
191
188
|
<>
|
192
189
|
{title && !status ? <Dialog.Header>{title}</Dialog.Header> : null}
|
@@ -195,7 +192,6 @@ const Dialog = (props: DialogProps): React.ReactElement => {
|
|
195
192
|
<Dialog.Body
|
196
193
|
className="dialog_status_text_align"
|
197
194
|
padding="md"
|
198
|
-
|
199
195
|
>
|
200
196
|
<Flex align="center"
|
201
197
|
orientation="column"
|
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
@import "./scss_partials/dropdown_animation";
|
11
11
|
|
12
|
-
|
12
|
+
[class*="pb_dropdown"] {
|
13
13
|
.dropdown_wrapper {
|
14
14
|
[class*="dropdown_trigger_wrapper"] {
|
15
15
|
@include pb_body;
|
@@ -131,7 +131,7 @@
|
|
131
131
|
}
|
132
132
|
}
|
133
133
|
|
134
|
-
|
134
|
+
&[class*="separators_hidden"] {
|
135
135
|
.dropdown_wrapper {
|
136
136
|
.pb_dropdown_container {
|
137
137
|
|
@@ -142,7 +142,7 @@
|
|
142
142
|
}
|
143
143
|
}
|
144
144
|
|
145
|
-
|
145
|
+
&[class*="subtle"] {
|
146
146
|
.dropdown_wrapper {
|
147
147
|
.pb_dropdown_container {
|
148
148
|
|
@@ -178,7 +178,7 @@
|
|
178
178
|
}
|
179
179
|
}
|
180
180
|
|
181
|
-
|
181
|
+
&[class*="separators_hidden"] {
|
182
182
|
.dropdown_wrapper {
|
183
183
|
.pb_dropdown_container {
|
184
184
|
[class*="pb_dropdown_option"]:first-child {
|
@@ -74,10 +74,8 @@ const Dropdown = forwardRef((props: DropdownProps, ref: any) => {
|
|
74
74
|
const htmlProps = buildHtmlProps(htmlOptions);
|
75
75
|
const separatorsClass = separators ? '' : 'separators_hidden'
|
76
76
|
const classes = classnames(
|
77
|
-
buildCss("pb_dropdown"),
|
77
|
+
buildCss("pb_dropdown", variant, separatorsClass),
|
78
78
|
globalProps(props),
|
79
|
-
variant,
|
80
|
-
separatorsClass,
|
81
79
|
className
|
82
80
|
);
|
83
81
|
|
@@ -24,7 +24,7 @@ module Playbook
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def classname
|
27
|
-
generate_classname("pb_dropdown", variant, separators_class
|
27
|
+
generate_classname("pb_dropdown", variant, separators_class)
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -38,7 +38,7 @@ module Playbook
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def separators_class
|
41
|
-
separators ?
|
41
|
+
separators ? nil : "separators_hidden"
|
42
42
|
end
|
43
43
|
|
44
44
|
def options_with_blank
|
@@ -50,7 +50,7 @@ test('generated default kit and classname', () => {
|
|
50
50
|
|
51
51
|
const kit = screen.getByTestId(testId)
|
52
52
|
expect(kit).toBeInTheDocument()
|
53
|
-
expect(kit).toHaveClass('
|
53
|
+
expect(kit).toHaveClass('pb_dropdown_default')
|
54
54
|
})
|
55
55
|
|
56
56
|
test('generated default Trigger and Container when none passed in', () => {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
import { buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
|
4
|
-
import { GlobalProps, globalProps
|
4
|
+
import { GlobalProps, globalProps } from '../utilities/globalProps'
|
5
5
|
import { GenericObject, Sizes } from '../types'
|
6
6
|
|
7
7
|
type FlexProps = {
|
@@ -61,7 +61,6 @@ const Flex = (props: FlexProps): React.ReactElement => {
|
|
61
61
|
const alignSelfClass = alignSelf !== 'none' ? `align_self_${alignSelf}` : ''
|
62
62
|
const dataProps = buildDataProps(data)
|
63
63
|
const htmlProps = buildHtmlProps(htmlOptions)
|
64
|
-
const dynamicInlineProps = globalInlineProps(props)
|
65
64
|
|
66
65
|
|
67
66
|
return (
|
@@ -84,7 +83,6 @@ const Flex = (props: FlexProps): React.ReactElement => {
|
|
84
83
|
globalProps(props),
|
85
84
|
className
|
86
85
|
)}
|
87
|
-
style={dynamicInlineProps}
|
88
86
|
{...dataProps}
|
89
87
|
{...htmlProps}
|
90
88
|
>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
import { buildCss, buildHtmlProps } from '../utilities/props'
|
4
|
-
import { globalProps, GlobalProps
|
4
|
+
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
5
5
|
type FlexItemPropTypes = {
|
6
6
|
children: React.ReactNode[] | React.ReactNode,
|
7
7
|
fixedSize?: string,
|
@@ -35,20 +35,14 @@ const FlexItem = (props: FlexItemPropTypes): React.ReactElement => {
|
|
35
35
|
const fixedStyle =
|
36
36
|
fixedSize !== undefined ? { flexBasis: `${fixedSize}` } : null
|
37
37
|
const orderClass = order !== 'none' ? `order_${order}` : null
|
38
|
-
const dynamicInlineProps = globalInlineProps(props)
|
39
|
-
const combinedStyles = {
|
40
|
-
...fixedStyle,
|
41
|
-
...dynamicInlineProps
|
42
|
-
}
|
43
38
|
|
44
39
|
const htmlProps = buildHtmlProps(htmlOptions)
|
45
40
|
|
46
|
-
|
47
41
|
return (
|
48
42
|
<div
|
49
43
|
{...htmlProps}
|
50
44
|
className={classnames(buildCss('pb_flex_item_kit', growClass, shrinkClass, flexClass, displayFlexClass), orderClass, alignSelfClass, globalProps(props), className)}
|
51
|
-
style={
|
45
|
+
style={fixedStyle}
|
52
46
|
>
|
53
47
|
{children}
|
54
48
|
</div>
|
@@ -20,13 +20,8 @@ module Playbook
|
|
20
20
|
generate_classname("pb_flex_item_kit", fixed_size_class, grow_class, shrink_class, display_flex_class) + align_self_class
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
25
|
-
styles << "flex-basis: #{fixed_size};" if fixed_size.present?
|
26
|
-
styles << "height: #{height};" if height.present?
|
27
|
-
styles << "min-height: #{min_height};" if min_height.present?
|
28
|
-
styles << "max-height: #{max_height};" if max_height.present?
|
29
|
-
styles.join(" ")
|
23
|
+
def style_value
|
24
|
+
"flex-basis: #{fixed_size};" if fixed_size.present?
|
30
25
|
end
|
31
26
|
|
32
27
|
private
|
@@ -21,7 +21,7 @@ import classnames from "classnames";
|
|
21
21
|
import { globalProps, GlobalProps } from "../utilities/globalProps";
|
22
22
|
import { uniqueId } from 'lodash';
|
23
23
|
|
24
|
-
type ModifiedGlobalProps = Omit<GlobalProps, 'minWidth'
|
24
|
+
type ModifiedGlobalProps = Omit<GlobalProps, 'minWidth'>
|
25
25
|
|
26
26
|
type PbPopoverProps = {
|
27
27
|
aria?: { [key: string]: string };
|
@@ -10,6 +10,24 @@
|
|
10
10
|
$pb_selectable_card_indicator_size: 22px;
|
11
11
|
$pb_selectable_card_border: 2px;
|
12
12
|
|
13
|
+
$pb_selectable_space_classes: (
|
14
|
+
xxs: $space_xxs,
|
15
|
+
xs: $space_xs,
|
16
|
+
sm: $space_sm,
|
17
|
+
md: $space_md,
|
18
|
+
lg: $space_lg,
|
19
|
+
xl: $space_xl,
|
20
|
+
);
|
21
|
+
$pb_selectable_paddings: (
|
22
|
+
p: "padding",
|
23
|
+
pr: "padding-right",
|
24
|
+
pl: "padding-left",
|
25
|
+
pt: "padding-top",
|
26
|
+
pb: "padding-bottom",
|
27
|
+
px: ("padding-left", "padding-right"),
|
28
|
+
py: ("padding-top", "padding-bottom")
|
29
|
+
);
|
30
|
+
|
13
31
|
[class^=pb_selectable_card_kit] {
|
14
32
|
display: block;
|
15
33
|
margin-bottom: 0;
|
@@ -28,7 +46,6 @@ $pb_selectable_card_border: 2px;
|
|
28
46
|
padding: $space_sm;
|
29
47
|
margin-bottom: $space_sm;
|
30
48
|
cursor: pointer;
|
31
|
-
outline: 1px solid transparent;
|
32
49
|
|
33
50
|
@media (hover:hover) {
|
34
51
|
&:hover {
|
@@ -74,6 +91,7 @@ $pb_selectable_card_border: 2px;
|
|
74
91
|
|
75
92
|
position: relative;
|
76
93
|
@include pb_card_selected;
|
94
|
+
padding: calc(#{$space_sm} - 1px);
|
77
95
|
transition-property: none;
|
78
96
|
transition-duration: 0s;
|
79
97
|
|
@@ -88,6 +106,54 @@ $pb_selectable_card_border: 2px;
|
|
88
106
|
background-color: $royal;
|
89
107
|
}
|
90
108
|
}
|
109
|
+
|
110
|
+
// Selected card has 1px more border
|
111
|
+
// Remove 1px so content does not "jump"
|
112
|
+
@each $position_name,
|
113
|
+
$position in $pb_selectable_paddings {
|
114
|
+
@each $space_name,
|
115
|
+
$space in $pb_selectable_space_classes {
|
116
|
+
~ label.#{$position_name}_#{$space_name} {
|
117
|
+
@if type-of($position)=="list" {
|
118
|
+
@each $coordinate in $position {
|
119
|
+
#{$coordinate}: calc(#{$space} - 1px) !important;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
@else {
|
124
|
+
#{$position}: calc(#{$space} - 1px) !important;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
&[class*=_display_input] {
|
133
|
+
input[type="checkbox"],
|
134
|
+
input[type="radio"] {
|
135
|
+
&:checked {
|
136
|
+
~label {
|
137
|
+
border-width: $pb_card_border_width;
|
138
|
+
outline: 1px solid $primary;
|
139
|
+
}
|
140
|
+
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
> label {
|
145
|
+
outline: 1px solid transparent;
|
146
|
+
padding: $space_sm;
|
147
|
+
}
|
148
|
+
|
149
|
+
&.dark {
|
150
|
+
input[type="checkbox"],
|
151
|
+
input[type="radio"] {
|
152
|
+
&:checked ~ label {
|
153
|
+
border-width: $pb_card_border_width;
|
154
|
+
outline: 1px solid $primary;
|
155
|
+
}
|
156
|
+
}
|
91
157
|
}
|
92
158
|
}
|
93
159
|
|
@@ -25,7 +25,7 @@
|
|
25
25
|
<% end %>
|
26
26
|
<div class="separator"></div>
|
27
27
|
<div class="psuedo_separator"></div>
|
28
|
-
<%= pb_rails("card", props: { padding: "sm", status: object.status, border_none: true }) do %>
|
28
|
+
<%= pb_rails("card", props: { padding: "sm", status: object.status, border_none: true, dark: object.dark }) do %>
|
29
29
|
<% if content.nil? %>
|
30
30
|
<%= pb_rails("body", props: { text: object.text }) %>
|
31
31
|
<% else %>
|
@@ -25,7 +25,7 @@ module Playbook
|
|
25
25
|
|
26
26
|
def classname
|
27
27
|
[
|
28
|
-
generate_classname_without_spacing("pb_selectable_card_kit", checked_class, enable_disabled_class),
|
28
|
+
generate_classname_without_spacing("pb_selectable_card_kit", checked_class, enable_disabled_class, display_input_class),
|
29
29
|
error_class,
|
30
30
|
dark_props,
|
31
31
|
].compact.join(" ")
|
@@ -79,6 +79,10 @@ module Playbook
|
|
79
79
|
def error_class
|
80
80
|
error ? "error" : nil
|
81
81
|
end
|
82
|
+
|
83
|
+
def display_input_class
|
84
|
+
variant == "display_input" ? "display_input" : nil
|
85
|
+
end
|
82
86
|
end
|
83
87
|
end
|
84
88
|
end
|
@@ -170,24 +170,12 @@ type ZIndex = {
|
|
170
170
|
zIndex?: ZIndexType,
|
171
171
|
} | ZIndexResponsiveType
|
172
172
|
|
173
|
-
type Height = {
|
174
|
-
height?: string
|
175
|
-
}
|
176
|
-
|
177
|
-
type MaxHeight = {
|
178
|
-
maxHeight?: string
|
179
|
-
}
|
180
|
-
|
181
|
-
type MinHeight = {
|
182
|
-
minHeight?: string
|
183
|
-
}
|
184
|
-
|
185
173
|
// keep this as the last type definition
|
186
174
|
export type GlobalProps = AlignContent & AlignItems & AlignSelf &
|
187
175
|
BorderRadius & Cursor & Dark & Display & DisplaySizes & Flex & FlexDirection &
|
188
176
|
FlexGrow & FlexShrink & FlexWrap & JustifyContent & JustifySelf &
|
189
177
|
LineHeight & Margin & MinWidth & MaxWidth & NumberSpacing & Order & Overflow & Padding &
|
190
|
-
Position & Shadow & TextAlign & Truncate & VerticalAlign & ZIndex & { hover?: string } & Top & Right & Bottom & Left
|
178
|
+
Position & Shadow & TextAlign & Truncate & VerticalAlign & ZIndex & { hover?: string } & Top & Right & Bottom & Left;
|
191
179
|
|
192
180
|
const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: string) => {
|
193
181
|
const keys: string[] = Object.keys(prop)
|
@@ -510,22 +498,7 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
|
|
510
498
|
} else {
|
511
499
|
return verticalAlign ? `vertical_align_${verticalAlign} ` : ''
|
512
500
|
}
|
513
|
-
}
|
514
|
-
|
515
|
-
}
|
516
|
-
|
517
|
-
const PROP_INLINE_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => {[key: string]: any}} = {
|
518
|
-
heightProps: ({ height }: Height) => {
|
519
|
-
return height ? { height } : {};
|
520
|
-
},
|
521
|
-
|
522
|
-
maxHeightProps: ({ maxHeight }: MaxHeight) => {
|
523
|
-
return maxHeight ? { maxHeight } : {};
|
524
|
-
},
|
525
|
-
|
526
|
-
minHeightProps: ({ minHeight }: MinHeight) => {
|
527
|
-
return minHeight ? { minHeight } : {};
|
528
|
-
},
|
501
|
+
}
|
529
502
|
}
|
530
503
|
|
531
504
|
type DefaultProps = {[key: string]: string} | Record<string, unknown>
|
@@ -537,16 +510,6 @@ export const globalProps = (props: GlobalProps, defaultProps: DefaultProps = {})
|
|
537
510
|
}).filter((value) => value?.length > 0).join(" ")
|
538
511
|
}
|
539
512
|
|
540
|
-
// New function for inline styles
|
541
|
-
export const globalInlineProps = (props: GlobalProps): React.CSSProperties => {
|
542
|
-
const styles = Object.keys(PROP_INLINE_CATEGORIES).reduce((acc, key) => {
|
543
|
-
const result = PROP_INLINE_CATEGORIES[key](props);
|
544
|
-
return { ...acc, ...(typeof result === 'object' ? result : {}) }; // Ensure result is an object before spreading
|
545
|
-
}, {});
|
546
|
-
|
547
|
-
return styles; // Return the styles object directly
|
548
|
-
}
|
549
|
-
|
550
513
|
|
551
514
|
export const deprecatedProps = (): void => {
|
552
515
|
// if (process.env.NODE_ENV === 'development') {
|