playbook_ui 11.19.0.pre.typeahead1 → 11.20.0.pre.alpha.focus1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_body/_body.scss +10 -1
  3. data/app/pb_kits/playbook/pb_body/docs/_body_styled.html.erb +9 -0
  4. data/app/pb_kits/playbook/pb_body/docs/_body_styled.jsx +20 -0
  5. data/app/pb_kits/playbook/pb_body/docs/_body_styled.md +1 -0
  6. data/app/pb_kits/playbook/pb_body/docs/example.yml +2 -0
  7. data/app/pb_kits/playbook/pb_body/docs/index.js +1 -0
  8. data/app/pb_kits/playbook/pb_button/_button.scss +0 -5
  9. data/app/pb_kits/playbook/pb_button/_button_mixins.scss +33 -2
  10. data/app/pb_kits/playbook/pb_button/docs/_button_icon_options.html.erb +2 -2
  11. data/app/pb_kits/playbook/pb_button/docs/_button_icon_options.jsx +2 -0
  12. data/app/pb_kits/playbook/pb_button/docs/_button_link.html.erb +3 -3
  13. data/app/pb_kits/playbook/pb_button/docs/_button_link.jsx +3 -0
  14. data/app/pb_kits/playbook/pb_button/docs/_button_loading.html.erb +3 -3
  15. data/app/pb_kits/playbook/pb_button/docs/_button_loading.jsx +3 -0
  16. data/app/pb_kits/playbook/pb_button/docs/_button_size.html.erb +3 -3
  17. data/app/pb_kits/playbook/pb_button/docs/_button_size.jsx +3 -0
  18. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +7 -7
  19. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.tsx +8 -8
  20. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +69 -3
  21. data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +1 -1
  22. data/app/pb_kits/playbook/pb_dialog/dialog.rb +1 -1
  23. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +12 -0
  24. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +15 -7
  25. data/app/pb_kits/playbook/pb_file_upload/docs/_description.md +2 -3
  26. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_custom_message.jsx +40 -0
  27. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -2
  28. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  29. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +12 -0
  30. data/app/pb_kits/playbook/pb_list/_list.tsx +97 -0
  31. data/app/pb_kits/playbook/pb_list/{_list_item.jsx → _list_item.tsx} +4 -6
  32. data/app/pb_kits/playbook/pb_popover/_popover.tsx +239 -0
  33. data/app/pb_kits/playbook/pb_popover/{index.js → index.ts} +10 -6
  34. data/app/pb_kits/playbook/pb_popover/popover.test.js +222 -0
  35. data/app/pb_kits/playbook/pb_radio/_radio.tsx +4 -4
  36. data/app/pb_kits/playbook/pb_select/_select.scss +1 -1
  37. data/app/pb_kits/playbook/pb_selectable_card/{_selectable_card.jsx → _selectable_card.tsx} +47 -42
  38. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_default.jsx +1 -2
  39. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_single_select.jsx +1 -1
  40. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.test.js +185 -0
  41. data/app/pb_kits/playbook/pb_selectable_icon/{_selectable_icon.jsx → _selectable_icon.tsx} +29 -32
  42. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_default.jsx +1 -5
  43. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_single_select.jsx +1 -4
  44. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.test.js +148 -0
  45. data/app/pb_kits/playbook/tokens/_accessibility.scss +6 -0
  46. data/app/pb_kits/playbook/tokens/_colors.scss +3 -1
  47. data/lib/playbook/version.rb +2 -2
  48. metadata +16 -8
  49. data/app/pb_kits/playbook/pb_list/_list.jsx +0 -98
  50. data/app/pb_kits/playbook/pb_popover/_popover.jsx +0 -227
@@ -38,3 +38,15 @@ test('displays max file size text', () => {
38
38
  const kit = screen.getByTestId(testid)
39
39
  expect(kit).toHaveTextContent('Choose a file or drag it here. Max file size is 1 MB.')
40
40
  })
41
+
42
+ test('displays custom message', () => {
43
+ render(
44
+ <FileUpload
45
+ customMessage={'Hello world!'}
46
+ data={{ testid: testid }}
47
+ />
48
+ )
49
+
50
+ const kit = screen.getByTestId(testid)
51
+ expect(kit).toHaveTextContent('Hello world!')
52
+ })
@@ -0,0 +1,97 @@
1
+ import React from "react";
2
+ import classnames from "classnames";
3
+ import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
4
+ import { globalProps } from "../utilities/globalProps";
5
+
6
+ type ListProps = {
7
+ aria?: { [key: string]: string };
8
+ borderless?: boolean;
9
+ className?: string;
10
+ children: React.ReactNode[] | React.ReactNode;
11
+ dark?: boolean;
12
+ data?: object;
13
+ id?: string;
14
+ layout: "" | "left" | "right";
15
+ ordered?: boolean;
16
+ role?: string;
17
+ tabIndex?: number;
18
+ text?: string;
19
+ size?: string;
20
+ variant?: string;
21
+ xpadding: boolean;
22
+ };
23
+
24
+ const List = (props: ListProps) => {
25
+ const {
26
+ aria = {},
27
+ borderless = false,
28
+ children,
29
+ className,
30
+ dark = false,
31
+ data = {},
32
+ id,
33
+ layout = "",
34
+ ordered = false,
35
+ role,
36
+ size = "",
37
+ tabIndex,
38
+ xpadding = false,
39
+ variant,
40
+ text,
41
+ } = props;
42
+
43
+ const layoutClass: { [key: string]: string } = {
44
+ left: "layout_left",
45
+ right: "layout_right",
46
+ default: "",
47
+ };
48
+
49
+ const childrenWithProps = React.Children.map(
50
+ children,
51
+ (child: React.ReactElement) => {
52
+ return React.cloneElement(child, { text, variant });
53
+ }
54
+ );
55
+ const ariaProps = buildAriaProps(aria);
56
+ const dataProps = buildDataProps(data);
57
+ const classes = classnames(
58
+ buildCss("pb_list_kit", layoutClass[layout], size, {
59
+ dark: dark,
60
+ borderless: borderless,
61
+ ordered: ordered,
62
+ xpadding: xpadding,
63
+ }),
64
+ globalProps(props),
65
+ className
66
+ );
67
+
68
+ return (
69
+ <div className={classes}>
70
+ {ordered ? (
71
+ <ol
72
+ {...ariaProps}
73
+ {...dataProps}
74
+ className={className}
75
+ id={id}
76
+ role={role}
77
+ tabIndex={tabIndex}
78
+ >
79
+ {childrenWithProps}
80
+ </ol>
81
+ ) : (
82
+ <ul
83
+ {...ariaProps}
84
+ {...dataProps}
85
+ className={className}
86
+ id={id}
87
+ role={role}
88
+ tabIndex={tabIndex}
89
+ >
90
+ {childrenWithProps}
91
+ </ul>
92
+ )}
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export default List;
@@ -1,17 +1,15 @@
1
- /* @flow */
2
-
3
- import React, { type Node } from 'react'
1
+ import React from 'react'
4
2
  import classnames from 'classnames'
5
3
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
4
  import { globalProps } from '../utilities/globalProps'
7
5
 
8
6
  type ListItemProps = {
9
- aria?: object,
10
- children: array<Node> | Node,
7
+ aria?: { [key: string]: string },
8
+ children: React.ReactNode[] | React.ReactNode,
11
9
  className?: string,
12
10
  data?: object,
13
11
  id?: string,
14
- tabIndex?: string,
12
+ tabIndex?: number,
15
13
  }
16
14
 
17
15
  const ListItem = (props: ListItemProps) => {
@@ -0,0 +1,239 @@
1
+ import React, { useEffect } from "react";
2
+ import ReactDOM from "react-dom";
3
+
4
+ import {
5
+ Popper,
6
+ Manager as PopperManager,
7
+ Modifier,
8
+ PopperProps,
9
+ Reference as PopperReference,
10
+ } from "react-popper";
11
+
12
+ import {
13
+ buildAriaProps,
14
+ buildCss,
15
+ buildDataProps,
16
+ noop,
17
+ } from "../utilities/props";
18
+
19
+ import classnames from "classnames";
20
+ import { globalProps, GlobalProps } from "../utilities/globalProps";
21
+
22
+ type PbPopoverProps = {
23
+ aria?: { [key: string]: string };
24
+ className?: string;
25
+ closeOnClick?: "outside" | "inside" | "any";
26
+ data?: object;
27
+ id?: string;
28
+ offset?: boolean;
29
+ reference: PopperReference & any;
30
+ show?: boolean;
31
+ shouldClosePopover?: (arg0: boolean) => boolean | boolean;
32
+ } & GlobalProps &
33
+ PopperProps<any>;
34
+
35
+ // Prop enabled default modifiers here
36
+ // https://popper.js.org/docs/v2/modifiers
37
+
38
+ const POPOVER_MODIFIERS = {
39
+ offset: {
40
+ //https://popper.js.org/docs/v2/modifiers/offset/
41
+ enabled: true,
42
+ name: "offset",
43
+ options: {
44
+ offset: [0, 20],
45
+ },
46
+ phase: "main",
47
+ },
48
+ };
49
+
50
+ const popoverModifiers = ({
51
+ modifiers,
52
+ offset,
53
+ }: {
54
+ modifiers: Modifier<any> & any;
55
+ offset: {};
56
+ }) => {
57
+ return offset ? modifiers.concat([POPOVER_MODIFIERS.offset]) : modifiers;
58
+ };
59
+
60
+ const Popover = (props: PbPopoverProps) => {
61
+ const {
62
+ aria = {},
63
+ className,
64
+ children,
65
+ data = {},
66
+ id,
67
+ modifiers,
68
+ offset,
69
+ placement,
70
+ referenceElement,
71
+ zIndex,
72
+ maxHeight,
73
+ maxWidth,
74
+ minHeight,
75
+ minWidth,
76
+ } = props;
77
+
78
+ const popoverSpacing =
79
+ globalProps(props).includes("dark") || !globalProps(props)
80
+ ? "p_sm"
81
+ : globalProps(props);
82
+ const overflowHandling = maxHeight || maxWidth ? "overflow_handling" : "";
83
+ const zIndexStyle = zIndex ? { zIndex: zIndex } : {};
84
+ const widthHeightStyles = () => {
85
+ return Object.assign(
86
+ {},
87
+ maxHeight ? { maxHeight: maxHeight } : {},
88
+ maxWidth ? { maxWidth: maxWidth } : {},
89
+ minHeight ? { minHeight: minHeight } : {},
90
+ minWidth ? { minWidth: minWidth } : {}
91
+ );
92
+ };
93
+ const ariaProps = buildAriaProps(aria);
94
+ const dataProps = buildDataProps(data);
95
+ const classes = classnames(
96
+ buildCss("pb_popover_kit"),
97
+ globalProps(props),
98
+ className
99
+ );
100
+
101
+ return (
102
+ <Popper
103
+ modifiers={popoverModifiers({ modifiers, offset })}
104
+ placement={placement}
105
+ referenceElement={referenceElement}
106
+ >
107
+ {({ placement, ref, style }) => {
108
+ return (
109
+ <div
110
+ {...ariaProps}
111
+ {...dataProps}
112
+ className={classes}
113
+ data-placement={placement}
114
+ id={id}
115
+ ref={ref}
116
+ style={Object.assign({}, style, zIndexStyle)}
117
+ >
118
+ <div
119
+ className={classnames(`${buildCss("pb_popover_tooltip")} show`)}
120
+ >
121
+ <div
122
+ className={classnames(
123
+ "pb_popover_body",
124
+ popoverSpacing,
125
+ overflowHandling
126
+ )}
127
+ style={widthHeightStyles()}
128
+ >
129
+ {children}
130
+ </div>
131
+ </div>
132
+ </div>
133
+ );
134
+ }}
135
+ </Popper>
136
+ );
137
+ };
138
+
139
+ const PbReactPopover = (props: PbPopoverProps) => {
140
+ const {
141
+ className,
142
+ children,
143
+ modifiers = [],
144
+ offset = false,
145
+ placement = "left",
146
+ portal = "body",
147
+ reference,
148
+ referenceElement,
149
+ show = false,
150
+ usePortal = true,
151
+ zIndex,
152
+ maxHeight,
153
+ maxWidth,
154
+ minHeight,
155
+ minWidth,
156
+ } = props;
157
+
158
+ useEffect(() => {
159
+ const { closeOnClick, shouldClosePopover = noop } = props;
160
+
161
+ if (!closeOnClick) return;
162
+
163
+ document.body.addEventListener(
164
+ "click",
165
+ ({ target }) => {
166
+ const targetIsPopover =
167
+ (target as HTMLElement).closest("[class^=pb_popover_tooltip]") !==
168
+ null;
169
+ const targetIsReference =
170
+ (target as HTMLElement).closest(".pb_popover_reference_wrapper") !==
171
+ null;
172
+
173
+ switch (closeOnClick) {
174
+ case "outside":
175
+ if (!targetIsPopover || targetIsReference) {
176
+ shouldClosePopover(true);
177
+ }
178
+ break;
179
+ case "inside":
180
+ if (targetIsPopover || targetIsReference) {
181
+ shouldClosePopover(true);
182
+ }
183
+ break;
184
+ case "any":
185
+ shouldClosePopover(true);
186
+ break;
187
+ }
188
+ },
189
+ { capture: true }
190
+ );
191
+ }, []);
192
+
193
+ const popoverComponent = (
194
+ <Popover
195
+ className={className}
196
+ maxHeight={maxHeight}
197
+ maxWidth={maxWidth}
198
+ minHeight={minHeight}
199
+ minWidth={minWidth}
200
+ modifiers={modifiers}
201
+ offset={offset}
202
+ placement={placement}
203
+ referenceElement={referenceElement}
204
+ zIndex={zIndex}
205
+ {...props}
206
+ >
207
+ {children}
208
+ </Popover>
209
+ );
210
+
211
+ return (
212
+ <PopperManager>
213
+ <>
214
+ {reference && !referenceElement && (
215
+ <PopperReference>
216
+ {({ ref }) => (
217
+ <span className="pb_popover_reference_wrapper" ref={ref}>
218
+ <reference.type {...reference.props} />
219
+ </span>
220
+ )}
221
+ </PopperReference>
222
+ )}
223
+ {show &&
224
+ (usePortal ? (
225
+ <>
226
+ {ReactDOM.createPortal(
227
+ popoverComponent,
228
+ document.querySelector(portal)
229
+ )}
230
+ </>
231
+ ) : (
232
+ { popoverComponent }
233
+ ))}
234
+ </>
235
+ </PopperManager>
236
+ );
237
+ };
238
+
239
+ export default PbReactPopover;
@@ -1,9 +1,13 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
- import { createPopper } from '@popperjs/core'
2
+ import { createPopper, Instance, Placement } from '@popperjs/core'
3
3
 
4
4
  const POPOVER_OFFSET_Y = [0, 20]
5
5
 
6
6
  export default class PbPopover extends PbEnhancedElement {
7
+ popper: Instance
8
+ _triggerElement: HTMLElement
9
+ _tooltip: HTMLElement
10
+ element: HTMLElement
7
11
  static get selector() {
8
12
  return '[data-pb-popover-kit]'
9
13
  }
@@ -14,8 +18,8 @@ export default class PbPopover extends PbEnhancedElement {
14
18
 
15
19
  connect() {
16
20
  this.moveTooltip()
17
- this.popper = createPopper(this.triggerElement, this.tooltip, {
18
- placement: this.position,
21
+ this.popper = createPopper (this.triggerElement, this.tooltip, {
22
+ placement: this.position as Placement,
19
23
  strategy: 'fixed',
20
24
  modifiers: [
21
25
  {
@@ -27,7 +31,7 @@ export default class PbPopover extends PbEnhancedElement {
27
31
  ],
28
32
  })
29
33
 
30
- this.triggerElement.addEventListener('click', (event) => {
34
+ this.triggerElement.addEventListener('click', (event: Event) => {
31
35
  event.preventDefault()
32
36
  event.stopPropagation()
33
37
 
@@ -43,8 +47,8 @@ export default class PbPopover extends PbEnhancedElement {
43
47
  }
44
48
 
45
49
  checkCloseTooltip() {
46
- document.querySelector('body').addEventListener('click', ({ target }) => {
47
- const isTooltipElement = target.closest(`#${this.tooltipId}`) !== null
50
+ document.querySelector('body').addEventListener('click', ({ target } ) => {
51
+ const isTooltipElement = (target as HTMLElement).closest(`#${this.tooltipId}`) !== null
48
52
 
49
53
  switch (this.closeOnClick) {
50
54
  case 'any':
@@ -0,0 +1,222 @@
1
+ import React from "react";
2
+ import { render, screen, fireEvent } from "../utilities/test-utils";
3
+ import { Button, PbReactPopover } from "..";
4
+
5
+ const testId = "popover-kit";
6
+
7
+ //Test default popover
8
+ const PopoverTest = () => {
9
+ const [mockState, setMockState] = React.useState(false)
10
+ const togglePopover = () => {
11
+ setMockState(!mockState)
12
+ }
13
+
14
+ const popoverReference = (
15
+ <Button onClick={togglePopover}
16
+ text="Click Me"
17
+ />
18
+ );
19
+ return (
20
+ <PbReactPopover
21
+ offset
22
+ reference={popoverReference}
23
+ show={mockState}
24
+ >
25
+ {"Click Anywhere"}
26
+ </PbReactPopover>
27
+ )
28
+ };
29
+ //Test popover with z-index
30
+ const PopoverTestZIndex = () => {
31
+ const [mockState, setMockState] = React.useState(false)
32
+ const togglePopover = () => {
33
+ setMockState(!mockState)
34
+ }
35
+
36
+ const popoverReference = (
37
+ <Button onClick={togglePopover}
38
+ text="Click Me"
39
+ />
40
+ );
41
+ return (
42
+ <PbReactPopover
43
+ offset
44
+ reference={popoverReference}
45
+ show={mockState}
46
+ zIndex={3}
47
+ >
48
+ {"Click Anywhere"}
49
+ </PbReactPopover>
50
+ )
51
+ };
52
+
53
+ //Test popover with max-height and max-width
54
+ const PopoverTestHeight = () => {
55
+ const [mockState, setMockState] = React.useState(false)
56
+ const togglePopover = () => {
57
+ setMockState(!mockState)
58
+ }
59
+
60
+ const popoverReference = (
61
+ <Button onClick={togglePopover}
62
+ text="Click Me"
63
+ />
64
+ );
65
+ return (
66
+ <PbReactPopover
67
+ maxHeight="150px"
68
+ maxWidth="240px"
69
+ offset
70
+ reference={popoverReference}
71
+ show={mockState}
72
+ >
73
+ {"Click Anywhere"}
74
+ </PbReactPopover>
75
+ )
76
+ };
77
+
78
+ //Test Popover with click to close 'anywhere'
79
+ const PopoverTestClicktoClose = () => {
80
+ const [mockState, setMockState] = React.useState(false)
81
+ const togglePopover = () => {
82
+ setMockState(!mockState)
83
+ }
84
+ const handleShouldClosePopover = (shouldClosePopover) => {
85
+ setMockState(!shouldClosePopover)
86
+ }
87
+
88
+ const popoverReference = (
89
+ <Button onClick={togglePopover}
90
+ text="Click Me"
91
+ />
92
+ );
93
+ return (
94
+ <PbReactPopover
95
+ closeOnClick="any"
96
+ offset
97
+ reference={popoverReference}
98
+ shouldClosePopover={handleShouldClosePopover}
99
+ show={mockState}
100
+ >
101
+ {"Click Anywhere"}
102
+ </PbReactPopover>
103
+ )
104
+ };
105
+
106
+ //Test Popover with click to close 'inside'
107
+ const PopoverTestClicktoClose2 = () => {
108
+ const [mockState, setMockState] = React.useState(false)
109
+ const togglePopover = () => {
110
+ setMockState(!mockState)
111
+ }
112
+ const handleShouldClosePopover = (shouldClosePopover) => {
113
+ setMockState(!shouldClosePopover)
114
+ }
115
+
116
+ const popoverReference = (
117
+ <Button onClick={togglePopover}
118
+ text="Click Me"
119
+ />
120
+ );
121
+ return (
122
+ <PbReactPopover
123
+ closeOnClick="inside"
124
+ offset
125
+ reference={popoverReference}
126
+ shouldClosePopover={handleShouldClosePopover}
127
+ show={mockState}
128
+ >
129
+ {"Click Inside"}
130
+ </PbReactPopover>
131
+ )
132
+ };
133
+
134
+ //Test Popover with click to close 'outside'
135
+ const PopoverTestClicktoClose3 = () => {
136
+ const [mockState, setMockState] = React.useState(false)
137
+ const togglePopover = () => {
138
+ setMockState(!mockState)
139
+ }
140
+ const handleShouldClosePopover = (shouldClosePopover) => {
141
+ setMockState(!shouldClosePopover)
142
+ }
143
+
144
+ const popoverReference = (
145
+ <Button onClick={togglePopover}
146
+ text="Click Me"
147
+ />
148
+ );
149
+ return (
150
+ <PbReactPopover
151
+ closeOnClick="outside"
152
+ offset
153
+ reference={popoverReference}
154
+ shouldClosePopover={handleShouldClosePopover}
155
+ show={mockState}
156
+ >
157
+ {"Click Outside"}
158
+ </PbReactPopover>
159
+ )
160
+ };
161
+
162
+
163
+ test("renders Popover", () => {
164
+ render(<PopoverTest data={{ testid: testId}}/>)
165
+ const btn = screen.getByText(/click me/i)
166
+ fireEvent.click(btn);
167
+ const kit = screen.getByText("Click Anywhere");
168
+ expect(kit).toBeInTheDocument();
169
+ });
170
+
171
+ test("renders Popover with z index", () => {
172
+ render(<PopoverTestZIndex data={{ testid: testId}}/>)
173
+ const btn = screen.getByText(/click me/i)
174
+ fireEvent.click(btn);
175
+ const kit = screen.getByText("Click Anywhere");
176
+ expect(kit).toHaveClass("pb_popover_body z_index_3");
177
+ });
178
+
179
+ test("renders Popover with max height and max width", () => {
180
+ render(<PopoverTestHeight data={{ testid: testId}}/>)
181
+ const btn = screen.getByText(/click me/i)
182
+ fireEvent.click(btn);
183
+ const kit = screen.getByText("Click Anywhere");
184
+ expect(kit).toHaveClass("pb_popover_body max_width_240px overflow_handling");
185
+ });
186
+
187
+ test("closes Popover on click anywhere", () => {
188
+ render(<PopoverTestClicktoClose data={{ testid: testId}}/>)
189
+ const btn = screen.getByText(/click me/i)
190
+ fireEvent.click(btn);
191
+ const kit = screen.getByText("Click Anywhere");
192
+ expect(kit).toBeInTheDocument();
193
+ fireEvent.click(kit);
194
+
195
+ expect(kit).not.toBeInTheDocument();
196
+
197
+ });
198
+
199
+ test("closes Popover on click inside", () => {
200
+ render(<PopoverTestClicktoClose2 data={{ testid: testId}}/>)
201
+ const btn = screen.getByText(/click me/i)
202
+ fireEvent.click(btn);
203
+ const kit = screen.getByText("Click Inside");
204
+ expect(kit).toBeInTheDocument();
205
+ fireEvent.click(kit);
206
+
207
+ expect(kit).not.toBeInTheDocument();
208
+
209
+ });
210
+
211
+ test("closes Popover on click outside", () => {
212
+ render(<PopoverTestClicktoClose3 data={{ testid: testId}}/>)
213
+ const btn = screen.getByText(/click me/i)
214
+ fireEvent.click(btn);
215
+ const kit = screen.getByText("Click Outside");
216
+ expect(kit).toBeInTheDocument();
217
+ fireEvent.click(kit);
218
+ expect(kit).toBeInTheDocument();
219
+ fireEvent.click(btn);
220
+ expect(kit).not.toBeInTheDocument();
221
+
222
+ });
@@ -10,16 +10,16 @@ type RadioProps = {
10
10
  aria?: {[key: string]: string},
11
11
  alignment?: string,
12
12
  checked?: boolean,
13
- children?: Node,
13
+ children?: React.ReactChild[] | React.ReactChild,
14
14
  className?: string,
15
15
  dark?: boolean,
16
16
  data?: {[key: string]: string},
17
17
  error?: boolean,
18
18
  id?: string,
19
19
  label: string,
20
- name: string,
21
- value: string,
22
- text: string,
20
+ name?: string,
21
+ value?: string,
22
+ text?: string,
23
23
  onChange: (event: React.FormEvent<HTMLInputElement> | null)=>void,
24
24
  } & GlobalProps
25
25
 
@@ -50,7 +50,7 @@
50
50
  border-color: $error;
51
51
  }
52
52
  .pb_select_kit_caret {
53
- top: 35%;
53
+ top: 25px;
54
54
  }
55
55
  }
56
56
  }