playbook_ui 15.3.0.pre.alpha.PLAY258611978 → 15.3.0.pre.alpha.PLAY260211773
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +5 -4
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns_and_header.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +1 -1
- data/app/pb_kits/playbook/pb_background/docs/_background_category.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_background.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_highlight.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_light.md +1 -1
- data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +0 -2
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +4 -16
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +1 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -2
- data/app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_custom_colors.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +0 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +6 -111
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -5
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -5
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +2 -148
- data/app/pb_kits/playbook/pb_filter/docs/_filter_max_width.md +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_rails.md +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_react.md +1 -1
- data/app/pb_kits/playbook/pb_icon/docs/_icon_color.md +1 -1
- data/app/pb_kits/playbook/pb_icon_circle/docs/_icon_circle_color.md +1 -1
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +14 -7
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.jsx +15 -6
- data/app/pb_kits/playbook/pb_layout/docs/_layout_collection.md +1 -1
- data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_item_spacing.md +1 -1
- data/app/pb_kits/playbook/pb_nav/docs/_nav_with_spacing_control.md +1 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_layout.md +1 -1
- data/app/pb_kits/playbook/pb_pill/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_popover/_popover.tsx +34 -69
- data/app/pb_kits/playbook/pb_popover/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_popover/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_popover/popover.test.js +0 -80
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_section_separator/docs/_description.md +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +0 -29
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_rails.md +1 -1
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_react.md +1 -1
- data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_side_highlight.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_sm.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/example.yml +0 -2
- data/app/pb_kits/playbook/pb_table/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -2
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +0 -41
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +9 -23
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_options.html.erb +1 -67
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_value.jsx +6 -68
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +1 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -2
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -2
- data/dist/chunks/{_line_graph-BokgW0SI.js → _line_graph-DdZxz7Mk.js} +1 -1
- data/dist/chunks/_typeahead-KEbTTXol.js +6 -0
- data/dist/chunks/_weekday_stacked-uS4ALvGc.js +37 -0
- data/dist/chunks/{lib-BXBHAZMY.js → lib-CGxXTQ75.js} +1 -1
- data/dist/chunks/{pb_form_validation-BZppqQZM.js → pb_form_validation-DebqlUKZ.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +2 -2
- 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/version.rb +1 -1
- metadata +8 -28
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range..md +0 -14
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range.jsx +0 -38
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.jsx +0 -18
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.md +0 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.jsx +0 -18
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.jsx +0 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.jsx +0 -38
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.md +0 -14
- data/app/pb_kits/playbook/pb_dropdown/quickpick/index.ts +0 -60
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.jsx +0 -68
- data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to_react.md +0 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.html.erb +0 -63
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.jsx +0 -89
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_rails.md +0 -4
- data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_react.md +0 -3
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.html.erb +0 -64
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.jsx +0 -70
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.md +0 -1
- data/dist/chunks/_typeahead-BR-uKbcO.js +0 -6
- data/dist/chunks/_weekday_stacked-n_2SPgc2.js +0 -37
- /data/app/pb_kits/playbook/pb_popover/docs/{_popover_append_to_rails.md → _popover_append_to.md} +0 -0
|
@@ -3,41 +3,48 @@
|
|
|
3
3
|
text: "Mercury",
|
|
4
4
|
unit: "AU",
|
|
5
5
|
value: 0.39,
|
|
6
|
-
variant:"
|
|
6
|
+
variant:"blue"
|
|
7
7
|
}) %>
|
|
8
8
|
<br>
|
|
9
9
|
<%= pb_rails("icon_stat_value", props: { icon: "planet-ringed",
|
|
10
10
|
text: "Venus",
|
|
11
11
|
unit: "AU",
|
|
12
12
|
value: 0.723,
|
|
13
|
-
variant:"
|
|
13
|
+
variant:"royal"
|
|
14
14
|
}) %>
|
|
15
15
|
<br>
|
|
16
16
|
<%= pb_rails("icon_stat_value", props: { icon: "planet-moon",
|
|
17
17
|
text: "Earth",
|
|
18
18
|
unit: "AU",
|
|
19
19
|
value: 1.0,
|
|
20
|
-
variant:"
|
|
20
|
+
variant:"purple"
|
|
21
21
|
}) %>
|
|
22
22
|
<br>
|
|
23
23
|
<%= pb_rails("icon_stat_value", props: { icon: "solar-system",
|
|
24
24
|
text: "Mars",
|
|
25
25
|
unit: "AU",
|
|
26
26
|
value: 1.524,
|
|
27
|
-
variant:"
|
|
27
|
+
variant:"teal"
|
|
28
28
|
}) %>
|
|
29
29
|
<br>
|
|
30
30
|
<%= pb_rails("icon_stat_value", props: { icon: "globe-americas",
|
|
31
|
-
text: "
|
|
31
|
+
text: "Jupitar",
|
|
32
32
|
unit: "AU",
|
|
33
33
|
value: 5.203,
|
|
34
|
-
variant:"
|
|
34
|
+
variant:"red"
|
|
35
35
|
}) %>
|
|
36
36
|
<br>
|
|
37
37
|
<%= pb_rails("icon_stat_value", props: { icon: "globe-africa",
|
|
38
38
|
text: "Saturn",
|
|
39
39
|
unit: "AU",
|
|
40
40
|
value: 9.539,
|
|
41
|
+
variant:"yellow"
|
|
42
|
+
}) %>
|
|
43
|
+
<br>
|
|
44
|
+
<%= pb_rails("icon_stat_value", props: { icon: "globe",
|
|
45
|
+
text: "Uranus",
|
|
46
|
+
unit: "AU",
|
|
47
|
+
value: 19.18,
|
|
41
48
|
variant:"green"
|
|
42
49
|
}) %>
|
|
43
50
|
<br>
|
|
@@ -46,4 +53,4 @@
|
|
|
46
53
|
unit: "AU",
|
|
47
54
|
value: 19.18,
|
|
48
55
|
variant:"orange"
|
|
49
|
-
}) %>
|
|
56
|
+
}) %>
|
|
@@ -9,7 +9,7 @@ const IconStatValueColor = (props) => {
|
|
|
9
9
|
text="Mercury"
|
|
10
10
|
unit="AU"
|
|
11
11
|
value={0.39}
|
|
12
|
-
variant="
|
|
12
|
+
variant="blue"
|
|
13
13
|
{...props}
|
|
14
14
|
/>
|
|
15
15
|
<br />
|
|
@@ -18,7 +18,7 @@ const IconStatValueColor = (props) => {
|
|
|
18
18
|
text="Venus"
|
|
19
19
|
unit="AU"
|
|
20
20
|
value={0.723}
|
|
21
|
-
variant="
|
|
21
|
+
variant="royal"
|
|
22
22
|
{...props}
|
|
23
23
|
/>
|
|
24
24
|
<br />
|
|
@@ -27,7 +27,7 @@ const IconStatValueColor = (props) => {
|
|
|
27
27
|
text="Earth"
|
|
28
28
|
unit="AU"
|
|
29
29
|
value={1.0}
|
|
30
|
-
variant="
|
|
30
|
+
variant="purple"
|
|
31
31
|
{...props}
|
|
32
32
|
/>
|
|
33
33
|
<br />
|
|
@@ -36,16 +36,16 @@ const IconStatValueColor = (props) => {
|
|
|
36
36
|
text="Mars"
|
|
37
37
|
unit="AU"
|
|
38
38
|
value={1.524}
|
|
39
|
-
variant="
|
|
39
|
+
variant="teal"
|
|
40
40
|
{...props}
|
|
41
41
|
/>
|
|
42
42
|
<br />
|
|
43
43
|
<IconStatValue
|
|
44
44
|
icon="globe-americas"
|
|
45
|
-
text="
|
|
45
|
+
text="Jupitar"
|
|
46
46
|
unit="AU"
|
|
47
47
|
value={5.203}
|
|
48
|
-
variant="
|
|
48
|
+
variant="red"
|
|
49
49
|
{...props}
|
|
50
50
|
/>
|
|
51
51
|
<br />
|
|
@@ -54,6 +54,15 @@ const IconStatValueColor = (props) => {
|
|
|
54
54
|
text="Saturn"
|
|
55
55
|
unit="AU"
|
|
56
56
|
value={9.539}
|
|
57
|
+
variant="yellow"
|
|
58
|
+
{...props}
|
|
59
|
+
/>
|
|
60
|
+
<br />
|
|
61
|
+
<IconStatValue
|
|
62
|
+
icon="globe"
|
|
63
|
+
text="Uranus"
|
|
64
|
+
unit="AU"
|
|
65
|
+
value={19.18}
|
|
57
66
|
variant="green"
|
|
58
67
|
{...props}
|
|
59
68
|
/>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Layout can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Layout can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/visual_guidelines" target="_blank">visual guidelines.</a>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `itemSpacing` prop can optionally be applied to the `Nav` parent element and accepts an object through which any of our Spacing
|
|
1
|
+
The `itemSpacing` prop can optionally be applied to the `Nav` parent element and accepts an object through which any of our [Spacing](https://playbook.powerapp.cloud/visual_guidelines/spacing) (padding, margin) global prop values can be passed as an object. All spacing values passed to `itemSpacing` will be applied to all navItems within the nav. Spacing (padding, margin) global props can still be used on nested navItems in conjunction with `itenSpacing` on the Nav for customized control. Any Spacing (padding,margin) global props applied directly to a navItem will override any competing `itemSpacing` value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
All Nav variants' navItems accept our global Spacing
|
|
1
|
+
All Nav variants' navItems accept our [global Spacing](https://playbook.powerapp.cloud/visual_guidelines/spacing) (padding, margin) props for custom spacing requirements. This example uses paddingY="xxs" and margin="none" on the bold variant to show this in action!
|
|
@@ -2,4 +2,4 @@ The optional `layout` prop accepts the `position` and `size` of the overlay as a
|
|
|
2
2
|
|
|
3
3
|
The `position` key accepts `bottom` (default), `top`, `y` (for both top and bottom) `right`, `left`, or `x` (for both left and right), which sets the side(s) where the `color` overlay starts. The direction of the overlay is always toward the opposite side of the position. For example, the default position of `bottom` starts the overlay on the bottom edge of your container and extends it toward the opposite side: the top.
|
|
4
4
|
|
|
5
|
-
The `size` value is `full` (100%) by default, but accepts our spacing tokens
|
|
5
|
+
The `size` value is `full` (100%) by default, but accepts our [spacing tokens](https://playbook.powerapp.cloud/visual_guidelines/spacing) or a percentage value as a string, and literally translates to how much of the container is covered by the overlay(s).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
A pill uses both a keyword and a specific color to categorize an item. Each pill directly corresponds to a data color <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
A pill uses both a keyword and a specific color to categorize an item. Each pill directly corresponds to a data color <a href="https://playbook.powerapp.cloud/visual_guidelines/colors" target="_blank">here</a>.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable react/no-multi-comp */
|
|
2
|
-
import React, { useEffect,
|
|
2
|
+
import React, { useEffect, useState } from "react";
|
|
3
3
|
import ReactDOM from "react-dom";
|
|
4
4
|
import {
|
|
5
5
|
Popper,
|
|
@@ -24,7 +24,6 @@ import { uniqueId } from '../utilities/object';
|
|
|
24
24
|
type ModifiedGlobalProps = Omit<GlobalProps, 'minWidth' | 'maxHeight' | 'minHeight'>
|
|
25
25
|
|
|
26
26
|
type PbPopoverProps = {
|
|
27
|
-
appendTo?: string;
|
|
28
27
|
aria?: { [key: string]: string };
|
|
29
28
|
className?: string;
|
|
30
29
|
closeOnClick?: "outside" | "inside" | "any";
|
|
@@ -63,25 +62,6 @@ const popoverModifiers = ({
|
|
|
63
62
|
return offset ? modifiers.concat([POPOVER_MODIFIERS.offset]) : modifiers;
|
|
64
63
|
};
|
|
65
64
|
|
|
66
|
-
const getAppendTarget = (
|
|
67
|
-
appendTo: string | undefined,
|
|
68
|
-
targetId: string
|
|
69
|
-
): HTMLElement => {
|
|
70
|
-
if (!appendTo || appendTo === "body") return document.body;
|
|
71
|
-
|
|
72
|
-
if (appendTo === "parent") {
|
|
73
|
-
const referenceWrapper = document.querySelector(`#reference-${targetId}`);
|
|
74
|
-
if (referenceWrapper?.parentElement) {
|
|
75
|
-
return referenceWrapper.parentElement;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const selectorMatch = document.querySelector(appendTo);
|
|
80
|
-
if (selectorMatch instanceof HTMLElement) return selectorMatch;
|
|
81
|
-
|
|
82
|
-
return document.body;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
65
|
const Popover = (props: PbPopoverProps) => {
|
|
86
66
|
const {
|
|
87
67
|
aria = {},
|
|
@@ -109,7 +89,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
|
109
89
|
const popoverSpacing =
|
|
110
90
|
filteredGlobalProps.includes("dark") || !filteredGlobalProps
|
|
111
91
|
? "p_sm"
|
|
112
|
-
: filteredGlobalProps
|
|
92
|
+
: filteredGlobalProps
|
|
113
93
|
const overflowHandling = maxHeight || maxWidth ? "overflow_handling" : "";
|
|
114
94
|
const zIndexStyle = zIndex ? { zIndex: zIndex } : {};
|
|
115
95
|
const widthHeightStyles = () => {
|
|
@@ -133,7 +113,7 @@ const Popover = (props: PbPopoverProps) => {
|
|
|
133
113
|
|
|
134
114
|
return (
|
|
135
115
|
<Popper
|
|
136
|
-
modifiers={popoverModifiers({ modifiers, offset
|
|
116
|
+
modifiers={popoverModifiers({ modifiers, offset })}
|
|
137
117
|
placement={placement}
|
|
138
118
|
referenceElement={referenceElement}
|
|
139
119
|
>
|
|
@@ -174,7 +154,6 @@ const Popover = (props: PbPopoverProps) => {
|
|
|
174
154
|
const PbReactPopover = (props: PbPopoverProps): React.ReactElement => {
|
|
175
155
|
const [targetId] = useState(uniqueId('id-'))
|
|
176
156
|
const {
|
|
177
|
-
appendTo,
|
|
178
157
|
className,
|
|
179
158
|
children,
|
|
180
159
|
modifiers = [],
|
|
@@ -191,56 +170,42 @@ const PbReactPopover = (props: PbPopoverProps): React.ReactElement => {
|
|
|
191
170
|
minHeight,
|
|
192
171
|
minWidth,
|
|
193
172
|
width,
|
|
194
|
-
closeOnClick,
|
|
195
|
-
shouldClosePopover = noop,
|
|
196
173
|
} = props;
|
|
197
174
|
|
|
198
|
-
// Store latest callback in a ref to avoid re-runs
|
|
199
|
-
const shouldClosePopoverRef = useRef(shouldClosePopover);
|
|
200
|
-
|
|
201
|
-
// Update ref on change
|
|
202
175
|
useEffect(() => {
|
|
203
|
-
|
|
204
|
-
}, [shouldClosePopover]);
|
|
176
|
+
const { closeOnClick, shouldClosePopover = noop } = props;
|
|
205
177
|
|
|
206
|
-
useEffect(() => {
|
|
207
178
|
if (!closeOnClick) return;
|
|
208
179
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
const handleClick = (e: MouseEvent) => {
|
|
214
|
-
const target = e.target as HTMLElement
|
|
215
|
-
|
|
216
|
-
const targetIsPopover =
|
|
217
|
-
target.closest("#" + targetId) !== null;
|
|
218
|
-
const targetIsReference =
|
|
219
|
-
target.closest("#reference-" + targetId) !== null;
|
|
180
|
+
document.body.addEventListener(
|
|
181
|
+
"click",
|
|
182
|
+
(e: MouseEvent) => {
|
|
183
|
+
const target = e.target as HTMLElement
|
|
220
184
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
185
|
+
const targetIsPopover =
|
|
186
|
+
target.closest("#" + targetId) !== null;
|
|
187
|
+
const targetIsReference =
|
|
188
|
+
target.closest("#reference-" + targetId) !== null;
|
|
224
189
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
break;
|
|
229
|
-
case "inside":
|
|
230
|
-
if (targetIsPopover) shouldClose();
|
|
231
|
-
break;
|
|
232
|
-
case "any":
|
|
233
|
-
if (targetIsPopover || !targetIsPopover && !targetIsReference) shouldClose();
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
};
|
|
190
|
+
const shouldClose = () => {
|
|
191
|
+
setTimeout(() => shouldClosePopover(true), 0);
|
|
192
|
+
}
|
|
237
193
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
194
|
+
switch (closeOnClick) {
|
|
195
|
+
case "outside":
|
|
196
|
+
if (!targetIsPopover && !targetIsReference) shouldClose();
|
|
197
|
+
break;
|
|
198
|
+
case "inside":
|
|
199
|
+
if (targetIsPopover) shouldClose();
|
|
200
|
+
break;
|
|
201
|
+
case "any":
|
|
202
|
+
if (targetIsPopover || !targetIsPopover && !targetIsReference) shouldClose();
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{ capture: true }
|
|
207
|
+
);
|
|
208
|
+
}, []);
|
|
244
209
|
|
|
245
210
|
const popoverComponent = (
|
|
246
211
|
<Popover
|
|
@@ -281,10 +246,10 @@ const PbReactPopover = (props: PbPopoverProps): React.ReactElement => {
|
|
|
281
246
|
{show &&
|
|
282
247
|
(usePortal ? (
|
|
283
248
|
<>
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
249
|
+
{ReactDOM.createPortal(
|
|
250
|
+
popoverComponent,
|
|
251
|
+
document.querySelector(portal)
|
|
252
|
+
)}
|
|
288
253
|
</>
|
|
289
254
|
) : (
|
|
290
255
|
{ popoverComponent }
|
|
@@ -4,4 +4,3 @@ export { default as PopoverClose } from './_popover_close.jsx'
|
|
|
4
4
|
export { default as PopoverZIndex } from './_popover_z_index.jsx'
|
|
5
5
|
export { default as PopoverScrollHeight } from './_popover_scroll_height.jsx'
|
|
6
6
|
export { default as PopoverActionableContent } from './_popover_actionable_content.jsx'
|
|
7
|
-
export { default as PopoverAppendTo } from './_popover_append_to.jsx'
|
|
@@ -159,62 +159,6 @@ const PopoverTestClicktoClose3 = () => {
|
|
|
159
159
|
)
|
|
160
160
|
};
|
|
161
161
|
|
|
162
|
-
//Test Popover with appendTo="parent"
|
|
163
|
-
const PopoverTestAppendToParent = () => {
|
|
164
|
-
const [mockState, setMockState] = React.useState(false)
|
|
165
|
-
const togglePopover = () => {
|
|
166
|
-
setMockState(!mockState)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const popoverReference = (
|
|
170
|
-
<Button onClick={togglePopover}
|
|
171
|
-
text="Click Me"
|
|
172
|
-
/>
|
|
173
|
-
);
|
|
174
|
-
return (
|
|
175
|
-
<div data-testid="parent-container"
|
|
176
|
-
id="parent-container"
|
|
177
|
-
>
|
|
178
|
-
<PbReactPopover
|
|
179
|
-
appendTo="parent"
|
|
180
|
-
offset
|
|
181
|
-
reference={popoverReference}
|
|
182
|
-
show={mockState}
|
|
183
|
-
>
|
|
184
|
-
{"Appended to parent"}
|
|
185
|
-
</PbReactPopover>
|
|
186
|
-
</div>
|
|
187
|
-
)
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
//Test Popover with appendTo CSS selector
|
|
191
|
-
const PopoverTestAppendToSelector = () => {
|
|
192
|
-
const [mockState, setMockState] = React.useState(false)
|
|
193
|
-
const togglePopover = () => {
|
|
194
|
-
setMockState(!mockState)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const popoverReference = (
|
|
198
|
-
<Button onClick={togglePopover}
|
|
199
|
-
text="Click Me"
|
|
200
|
-
/>
|
|
201
|
-
);
|
|
202
|
-
return (
|
|
203
|
-
<div data-testid="custom-container"
|
|
204
|
-
id="custom-container"
|
|
205
|
-
>
|
|
206
|
-
<PbReactPopover
|
|
207
|
-
appendTo="#custom-container"
|
|
208
|
-
offset
|
|
209
|
-
reference={popoverReference}
|
|
210
|
-
show={mockState}
|
|
211
|
-
>
|
|
212
|
-
{"Appended to custom container"}
|
|
213
|
-
</PbReactPopover>
|
|
214
|
-
</div>
|
|
215
|
-
)
|
|
216
|
-
};
|
|
217
|
-
|
|
218
162
|
|
|
219
163
|
test("renders Popover", () => {
|
|
220
164
|
render(<PopoverTest data={{ testid: testId}}/>)
|
|
@@ -273,28 +217,4 @@ const PopoverTestAppendToSelector = () => {
|
|
|
273
217
|
fireEvent.click(btn);
|
|
274
218
|
|
|
275
219
|
expect(kit).not.toBeInTheDocument;
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
test("renders Popover with appendTo parent", () => {
|
|
279
|
-
render(<PopoverTestAppendToParent data={{ testid: testId}}/>)
|
|
280
|
-
const btn = screen.getByText(/click me/i)
|
|
281
|
-
fireEvent.click(btn);
|
|
282
|
-
const kit = screen.getByText("Appended to parent");
|
|
283
|
-
expect(kit).toBeInTheDocument();
|
|
284
|
-
|
|
285
|
-
// Check that the popover is rendered inside the parent container
|
|
286
|
-
const parentContainer = screen.getByTestId("parent-container");
|
|
287
|
-
expect(parentContainer).toContainElement(kit);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
test("renders Popover with appendTo CSS selector", () => {
|
|
291
|
-
render(<PopoverTestAppendToSelector data={{ testid: testId}}/>)
|
|
292
|
-
const btn = screen.getByText(/click me/i)
|
|
293
|
-
fireEvent.click(btn);
|
|
294
|
-
const kit = screen.getByText("Appended to custom container");
|
|
295
|
-
expect(kit).toBeInTheDocument();
|
|
296
|
-
|
|
297
|
-
// Check that the popover is rendered inside the custom container
|
|
298
|
-
const customContainer = screen.getByTestId("custom-container");
|
|
299
|
-
expect(customContainer).toContainElement(kit);
|
|
300
220
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
NOTE: All editors have a default max-width of "md". Use our [Max Width global prop](https://playbook.powerapp.cloud/
|
|
1
|
+
NOTE: All editors have a default max-width of "md". Use our [Max Width global prop](https://playbook.powerapp.cloud/visual_guidelines/max_width) to override this default, as necessary.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Section separator is a divider line that compartmentalizes content, typically used on cards or white backgrounds.
|
|
2
2
|
|
|
3
|
-
To ensure that the section separator is properly rendered, please be sure to use our global `width` prop to set width to 100%. [See here](https://playbook.powerapp.cloud/
|
|
3
|
+
To ensure that the section separator is properly rendered, please be sure to use our global `width` prop to set width to 100%. [See here](https://playbook.powerapp.cloud/visual_guidelines/width) for more information on the global width prop.
|
|
@@ -216,33 +216,4 @@ $pb_selectable_paddings: (
|
|
|
216
216
|
background: $error;
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
.pb_selectable_card_kit_disabled,
|
|
222
|
-
.pb_selectable_card_kit_checked_disabled {
|
|
223
|
-
>label {
|
|
224
|
-
cursor: not-allowed;
|
|
225
|
-
|
|
226
|
-
@media (hover:hover) {
|
|
227
|
-
&:hover {
|
|
228
|
-
box-shadow: none !important;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
.pb_selectable_card_kit_disabled>label {
|
|
235
|
-
border-color: $border_light !important;
|
|
236
|
-
|
|
237
|
-
.dark & {
|
|
238
|
-
border-color: $border_dark !important;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
.pb_selectable_card_kit_checked_disabled>label {
|
|
243
|
-
border-color: $primary !important;
|
|
244
|
-
|
|
245
|
-
.dark & {
|
|
246
|
-
border-color: $primary_action_dark !important;
|
|
247
|
-
}
|
|
248
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `border_radius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/
|
|
1
|
+
The `border_radius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/visual_guidelines/border_radius) tokens, with `sm` as default.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
The `borderRadius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/
|
|
1
|
+
The `borderRadius` prop accepts all of our [BorderRadius](https://playbook.powerapp.cloud/visual_guidelines/border_radius) tokens, with `sm` as default.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Use the `stack` and `gap` props in conjunction to layer multiple Skeleton loading bars on top of each other.
|
|
2
2
|
|
|
3
|
-
`stack` accepts a number that correlates to the number of rows (1 is default), and `gap` accepts a portion of our [spacing props](https://playbook.powerapp.cloud/
|
|
3
|
+
`stack` accepts a number that correlates to the number of rows (1 is default), and `gap` accepts a portion of our [spacing props](https://playbook.powerapp.cloud/visual_guidelines/spacing) (`xxs` as default, `xs`, `sm`, `md`, `lg`, `xl`, `xxl`) to set the pixel distance between each row. `gap` will not do anything if there is no corresponding `stack` prop set.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Side highlight can take product, status, and category colors. To view full list of colors, visit <a href="https://playbook.powerapp.cloud/
|
|
1
|
+
Side highlight can take product, status, and category colors. To view full list of colors, visit <a href="https://playbook.powerapp.cloud/visual_guidelines" target="_blank">token colors</a>.
|
|
2
2
|
|
|
3
3
|
Note: Only use category colors for categories. Do not mix it with product or status colors.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Use table size `"sm"` when data density is a priority. Smaller row height enables the user to view more data without the need for scrolling.
|
|
2
2
|
|
|
3
|
-
Table can leverage the max-width property. Learn more
|
|
3
|
+
Table can leverage the max-width property. Learn more in our <a href="https://playbook.powerapp.cloud/visual_guidelines" target="_blank">visual guidelines.</a>
|
|
@@ -31,7 +31,6 @@ examples:
|
|
|
31
31
|
- table_with_subcomponents_as_divs: Table with Sub Components (Divs)
|
|
32
32
|
- table_outer_padding: Outer Padding
|
|
33
33
|
- table_with_collapsible: Table with Collapsible
|
|
34
|
-
- table_with_dynamic_collapsible: Table with Dynamic Collapsible
|
|
35
34
|
- table_with_collapsible_with_custom_click: Table with Collapsible with Custom Click
|
|
36
35
|
- table_with_collapsible_with_custom_content_rails: Table with Collapsible with Custom Content
|
|
37
36
|
- table_with_collapsible_with_nested_rows_rails: Table with Collapsible with Nested Rows
|
|
@@ -72,7 +71,6 @@ examples:
|
|
|
72
71
|
- table_with_subcomponents_as_divs: Table with Sub Components (Divs)
|
|
73
72
|
- table_outer_padding: Outer Padding
|
|
74
73
|
- table_with_collapsible: Table with Collapsible
|
|
75
|
-
- table_with_dynamic_collapsible: Table with Dynamic Collapsible
|
|
76
74
|
- table_with_collapsible_with_custom_click: Table with Collapsible with Custom Click
|
|
77
75
|
- table_with_collapsible_with_custom_content: Table with Collapsible with Custom Content
|
|
78
76
|
- table_with_collapsible_with_nested_rows: Table with Collapsible with Nested Rows
|
|
@@ -29,7 +29,6 @@ export { default as TableStickyLeftColumns } from './_table_sticky_left_columns.
|
|
|
29
29
|
export { default as TableStickyRightColumns } from './_table_sticky_right_columns.jsx'
|
|
30
30
|
export { default as TableStickyColumns } from './_table_sticky_columns.jsx'
|
|
31
31
|
export { default as TableWithCollapsible } from './_table_with_collapsible.jsx'
|
|
32
|
-
export { default as TableWithDynamicCollapsible } from './_table_with_dynamic_collapsible.jsx'
|
|
33
32
|
export { default as TableWithCollapsibleWithCustomContent } from './_table_with_collapsible_with_custom_content.jsx'
|
|
34
33
|
export { default as TableWithCollapsibleWithNestedTable } from './_table_with_collapsible_with_nested_table.jsx'
|
|
35
34
|
export { default as TableWithCollapsibleWithNestedRows } from './_table_with_collapsible_with_nested_rows.jsx'
|
|
@@ -99,8 +99,8 @@ module Playbook
|
|
|
99
99
|
# Convert camelCase (ex. notAllowed) to kebab-case (ex. not-allowed)
|
|
100
100
|
cursor.to_s.gsub(/([a-z\d])([A-Z])/, '\1-\2').downcase
|
|
101
101
|
else
|
|
102
|
-
# Default to '
|
|
103
|
-
"
|
|
102
|
+
# Default to 'pointer'
|
|
103
|
+
"pointer"
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
@@ -171,45 +171,4 @@ test('typeahead with defaultValue with focus behavior', async () => {
|
|
|
171
171
|
expect(focusedOption).toBeInTheDocument()
|
|
172
172
|
expect(focusedOption).toHaveTextContent('Red')
|
|
173
173
|
})
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
test('typeahead with grouped options and defaultValue focus behavior', async () => {
|
|
177
|
-
const groupedOptions = [
|
|
178
|
-
{
|
|
179
|
-
label: "Warm Colors",
|
|
180
|
-
options: [
|
|
181
|
-
{ label: "Red", value: "#FF0000" },
|
|
182
|
-
{ label: "Orange", value: "#FFA500" },
|
|
183
|
-
{ label: "Yellow", value: "#FFFF00" }
|
|
184
|
-
]
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
label: "Cool Colors",
|
|
188
|
-
options: [
|
|
189
|
-
{ label: "Blue", value: "#0000FF" },
|
|
190
|
-
{ label: "Teal", value: "#008080" },
|
|
191
|
-
{ label: "Cyan", value: "#00FFFF" }
|
|
192
|
-
]
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
label: "Fun Shades",
|
|
196
|
-
options: [
|
|
197
|
-
{ label: "Pink", value: "#FFC0CB" },
|
|
198
|
-
{ label: "Magenta", value: "#FF00FF" },
|
|
199
|
-
{ label: "Purple", value: "#800080" }
|
|
200
|
-
]
|
|
201
|
-
}
|
|
202
|
-
]
|
|
203
|
-
|
|
204
|
-
render(
|
|
205
|
-
<Typeahead
|
|
206
|
-
data={{ testid: 'grouped-options-focus-test' }}
|
|
207
|
-
defaultValue={[{ label: "Pink", value: "#FFC0CB" }]}
|
|
208
|
-
options={groupedOptions}
|
|
209
|
-
/>
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
const kit = screen.getByTestId('grouped-options-focus-test')
|
|
213
|
-
const inputDiv = kit.querySelector(".typeahead-kit-select__single-value")
|
|
214
|
-
expect(inputDiv).toHaveTextContent("Pink")
|
|
215
174
|
})
|
|
@@ -144,18 +144,6 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
|
|
|
144
144
|
// Create a ref to access React Select instance
|
|
145
145
|
const selectRef = useRef<any>(null)
|
|
146
146
|
|
|
147
|
-
// Helper function to flatten grouped options if custom groups are used
|
|
148
|
-
const flattenOptions = (options: any[]): any[] => {
|
|
149
|
-
if (!options) return []
|
|
150
|
-
|
|
151
|
-
return options.reduce((acc, option) => {
|
|
152
|
-
if (option.options && Array.isArray(option.options)) {
|
|
153
|
-
return [...acc, ...option.options]
|
|
154
|
-
}
|
|
155
|
-
return [...acc, option]
|
|
156
|
-
}, [])
|
|
157
|
-
}
|
|
158
|
-
|
|
159
147
|
// Configure focus on selected option using React Select's API
|
|
160
148
|
const handleMenuOpen = () => {
|
|
161
149
|
setTimeout(() => {
|
|
@@ -171,18 +159,17 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
|
|
|
171
159
|
|
|
172
160
|
const options = props.options
|
|
173
161
|
if (options) {
|
|
174
|
-
//
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
const targetOption = flatOptions.find((option: any) => {
|
|
162
|
+
// Find the index of the current value
|
|
163
|
+
const focusedIndex = options.findIndex((option: any) => {
|
|
178
164
|
const optionValue = props.getOptionValue ? props.getOptionValue(option) : option.value
|
|
179
165
|
const currentOptionValue = props.getOptionValue ? props.getOptionValue(currentValue) : currentValue.value
|
|
180
166
|
return optionValue === currentOptionValue
|
|
181
167
|
})
|
|
182
168
|
|
|
183
|
-
if (
|
|
169
|
+
if (focusedIndex >= 0 && options[focusedIndex]) {
|
|
184
170
|
// Use React Select's internal state to set focused option
|
|
185
171
|
if (selectRef.current && selectRef.current.setState) {
|
|
172
|
+
const targetOption = options[focusedIndex]
|
|
186
173
|
selectRef.current.setState({
|
|
187
174
|
focusedOption: targetOption,
|
|
188
175
|
focusedValue: null
|
|
@@ -192,12 +179,11 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
|
|
|
192
179
|
setTimeout(() => {
|
|
193
180
|
if (selectRef.current && selectRef.current.menuListRef) {
|
|
194
181
|
const menuElement = selectRef.current.menuListRef
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
const optionHeight = focusedElement.offsetHeight
|
|
182
|
+
if (menuElement && menuElement.children && menuElement.children[focusedIndex]) {
|
|
183
|
+
// Calculate the position of the selected option and scroll the menu container
|
|
184
|
+
const optionElement = menuElement.children[focusedIndex] as HTMLElement
|
|
185
|
+
const optionTop = optionElement.offsetTop
|
|
186
|
+
const optionHeight = optionElement.offsetHeight
|
|
201
187
|
const menuHeight = menuElement.clientHeight
|
|
202
188
|
|
|
203
189
|
// Set the menu's scrollTop to position the selected option in the middle
|