@spaced-out/ui-design-system 0.1.130 → 0.2.0

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [0.2.0](https://github.com/spaced-out/ui-design-system/compare/v0.1.130...v0.2.0) (2024-09-27)
6
+
7
+
8
+ ### Features
9
+
10
+ * upgrade genesis to react 17 and click away changes ([#270](https://github.com/spaced-out/ui-design-system/issues/270)) ([6ab5f93](https://github.com/spaced-out/ui-design-system/commit/6ab5f930813feb1dffaeb030983d13dbd8ebd3bf))
11
+
5
12
  ### [0.1.130](https://github.com/spaced-out/ui-design-system/compare/v0.1.130-beta.0...v0.1.130) (2024-09-12)
6
13
 
7
14
 
@@ -10,6 +10,7 @@ var _size = require("../../styles/variables/_size");
10
10
  var _space = require("../../styles/variables/_space");
11
11
  var _classify = require("../../utils/classify");
12
12
  var _clickAway = require("../../utils/click-away");
13
+ var _mergeRefs = require("../../utils/merge-refs");
13
14
  var _Button = require("../Button");
14
15
  var _ConditionalWrapper = require("../ConditionalWrapper");
15
16
  var _Menu = require("../Menu");
@@ -84,8 +85,9 @@ const ButtonDropdown = /*#__PURE__*/React.forwardRef((_ref, forwardRef) => {
84
85
  let {
85
86
  isOpen,
86
87
  onOpen,
87
- cancelNext,
88
- clickAway
88
+ clickAway,
89
+ boundaryRef,
90
+ triggerRef
89
91
  } = _ref2;
90
92
  return /*#__PURE__*/React.createElement("div", {
91
93
  "data-testid": "ButtonDropdown",
@@ -103,7 +105,7 @@ const ButtonDropdown = /*#__PURE__*/React.forwardRef((_ref, forwardRef) => {
103
105
  iconRightType: iconRightType,
104
106
  disabled: disabled,
105
107
  size: size,
106
- ref: refs.setReference,
108
+ ref: (0, _mergeRefs.mergeRefs)([refs.setReference, triggerRef]),
107
109
  onClick: e => {
108
110
  onClick?.(e);
109
111
  e.stopPropagation();
@@ -115,8 +117,7 @@ const ButtonDropdown = /*#__PURE__*/React.forwardRef((_ref, forwardRef) => {
115
117
  icon: classNames?.buttonIcon
116
118
  }
117
119
  }), children)), isOpen && menu && /*#__PURE__*/React.createElement("div", {
118
- onClickCapture: cancelNext,
119
- ref: refs.setFloating,
120
+ ref: (0, _mergeRefs.mergeRefs)([refs.setFloating, boundaryRef]),
120
121
  style: {
121
122
  display: 'flex',
122
123
  position: strategy,
@@ -18,6 +18,7 @@ import {sizeFluid} from '../../styles/variables/_size';
18
18
  import {spaceNone, spaceXXSmall} from '../../styles/variables/_space';
19
19
  import {classify} from '../../utils/classify';
20
20
  import {type ClickAwayRefType, ClickAway} from '../../utils/click-away';
21
+ import {mergeRefs} from '../../utils/merge-refs';
21
22
  import type {ButtonProps} from '../Button';
22
23
  import {Button} from '../Button';
23
24
  import {ConditionalWrapper} from '../ConditionalWrapper';
@@ -115,7 +116,7 @@ export const ButtonDropdown: React$AbstractComponent<
115
116
 
116
117
  return (
117
118
  <ClickAway onChange={onMenuToggle} clickAwayRef={clickAwayRef}>
118
- {({isOpen, onOpen, cancelNext, clickAway}) => (
119
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
119
120
  <div
120
121
  data-testid="ButtonDropdown"
121
122
  className={classify(
@@ -148,7 +149,7 @@ export const ButtonDropdown: React$AbstractComponent<
148
149
  iconRightType={iconRightType}
149
150
  disabled={disabled}
150
151
  size={size}
151
- ref={refs.setReference}
152
+ ref={mergeRefs([refs.setReference, triggerRef])}
152
153
  onClick={(e) => {
153
154
  onClick?.(e);
154
155
  e.stopPropagation();
@@ -166,8 +167,7 @@ export const ButtonDropdown: React$AbstractComponent<
166
167
 
167
168
  {isOpen && menu && (
168
169
  <div
169
- onClickCapture={cancelNext}
170
- ref={refs.setFloating}
170
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
171
171
  style={{
172
172
  display: 'flex',
173
173
  position: strategy,
@@ -10,6 +10,7 @@ var _lodash = require("lodash");
10
10
  var _space = require("../../styles/variables/_space");
11
11
  var _classify = _interopRequireDefault(require("../../utils/classify"));
12
12
  var _clickAway = require("../../utils/click-away");
13
+ var _mergeRefs = require("../../utils/merge-refs");
13
14
  var _Menu = require("../Menu");
14
15
  var _ButtonTab = require("./ButtonTab");
15
16
  var _ButtonTabDropdownModule = _interopRequireDefault(require("./ButtonTabDropdown.module.css"));
@@ -75,23 +76,23 @@ const ButtonTabDropdown = _ref => {
75
76
  let {
76
77
  isOpen,
77
78
  onOpen,
78
- cancelNext,
79
- clickAway
79
+ clickAway,
80
+ boundaryRef,
81
+ triggerRef
80
82
  } = _ref3;
81
83
  return /*#__PURE__*/React.createElement("div", {
82
84
  "data-testid": "ButtonTabDropdown",
83
85
  ref: menuBtnRef,
84
86
  className: (0, _classify.default)(_ButtonTabDropdownModule.default.buttonTabDropDownWrapper, dropdownClass)
85
87
  }, /*#__PURE__*/React.createElement(_ButtonTab.ButtonTab, _extends({}, buttonTabProps, {
86
- ref: refs.setReference,
88
+ ref: (0, _mergeRefs.mergeRefs)([refs.setReference, triggerRef]),
87
89
  selectedButtonTabId: moreTabSelectedId,
88
90
  onButtonTabSelect: (id, e) => {
89
91
  e?.stopPropagation();
90
92
  onOpen();
91
93
  }
92
94
  }), title), isOpen && /*#__PURE__*/React.createElement("div", {
93
- onClickCapture: cancelNext,
94
- ref: refs.setFloating,
95
+ ref: (0, _mergeRefs.mergeRefs)([refs.setFloating, boundaryRef]),
95
96
  style: {
96
97
  display: 'flex',
97
98
  position: strategy,
@@ -18,6 +18,7 @@ import {includes} from 'lodash';
18
18
  import {spaceNone, spaceXXSmall} from '../../styles/variables/_space';
19
19
  import classify from '../../utils/classify';
20
20
  import {ClickAway} from '../../utils/click-away';
21
+ import {mergeRefs} from '../../utils/merge-refs';
21
22
  import type {AnchorType} from '../ButtonDropdown';
22
23
  import {Menu} from '../Menu';
23
24
 
@@ -87,7 +88,7 @@ export const ButtonTabDropdown = ({
87
88
 
88
89
  return (
89
90
  <ClickAway>
90
- {({isOpen, onOpen, cancelNext, clickAway}) => (
91
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
91
92
  <div
92
93
  data-testid="ButtonTabDropdown"
93
94
  ref={menuBtnRef}
@@ -95,7 +96,7 @@ export const ButtonTabDropdown = ({
95
96
  >
96
97
  <ButtonTab
97
98
  {...buttonTabProps}
98
- ref={refs.setReference}
99
+ ref={mergeRefs([refs.setReference, triggerRef])}
99
100
  selectedButtonTabId={moreTabSelectedId}
100
101
  onButtonTabSelect={(id, e) => {
101
102
  e?.stopPropagation();
@@ -106,8 +107,7 @@ export const ButtonTabDropdown = ({
106
107
  </ButtonTab>
107
108
  {isOpen && (
108
109
  <div
109
- onClickCapture={cancelNext}
110
- ref={refs.setFloating}
110
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
111
111
  style={{
112
112
  display: 'flex',
113
113
  position: strategy,
@@ -10,6 +10,7 @@ var _size = require("../../styles/variables/_size");
10
10
  var _space = require("../../styles/variables/_space");
11
11
  var _classify = require("../../utils/classify");
12
12
  var _clickAway = require("../../utils/click-away");
13
+ var _mergeRefs = require("../../utils/merge-refs");
13
14
  var _Input = require("../Input");
14
15
  var _Menu = require("../Menu");
15
16
  var _DropdownModule = _interopRequireDefault(require("./Dropdown.module.css"));
@@ -58,13 +59,14 @@ const Dropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
58
59
  let {
59
60
  isOpen,
60
61
  onOpen,
61
- cancelNext,
62
- clickAway
62
+ clickAway,
63
+ boundaryRef,
64
+ triggerRef
63
65
  } = _ref2;
64
66
  return /*#__PURE__*/React.createElement("div", {
65
67
  "data-testid": "Dropdown",
66
68
  className: (0, _classify.classify)(_DropdownModule.default.dropdownContainer, classNames?.wrapper),
67
- ref: dropdownRef
69
+ ref: (0, _mergeRefs.mergeRefs)([dropdownRef, boundaryRef])
68
70
  }, /*#__PURE__*/React.createElement(_Input.Input, _extends({}, inputProps, {
69
71
  onKeyDown: e => {
70
72
  if (e.keyCode === 32) {
@@ -72,7 +74,7 @@ const Dropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
72
74
  isOpen ? clickAway() : onOpen();
73
75
  }
74
76
  },
75
- boxRef: refs.setReference,
77
+ boxRef: (0, _mergeRefs.mergeRefs)([refs.setReference, triggerRef]),
76
78
  size: size,
77
79
  placeholder: placeholder,
78
80
  value: dropdownInputText,
@@ -87,8 +89,7 @@ const Dropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
87
89
  },
88
90
  ref: ref
89
91
  })), isOpen && menu && /*#__PURE__*/React.createElement("div", {
90
- onClickCapture: cancelNext,
91
- ref: refs.setFloating,
92
+ ref: (0, _mergeRefs.mergeRefs)([refs.setFloating, boundaryRef]),
92
93
  style: {
93
94
  position: strategy,
94
95
  top: y ?? _space.spaceNone,
@@ -16,6 +16,7 @@ import {sizeFluid} from '../../styles/variables/_size';
16
16
  import {spaceNone, spaceXXSmall} from '../../styles/variables/_space';
17
17
  import {classify} from '../../utils/classify';
18
18
  import {type ClickAwayRefType, ClickAway} from '../../utils/click-away';
19
+ import {mergeRefs} from '../../utils/merge-refs';
19
20
  import type {InputProps} from '../Input';
20
21
  import {Input} from '../Input';
21
22
  import type {MenuOption, MenuProps} from '../Menu';
@@ -78,11 +79,11 @@ export const Dropdown: React$AbstractComponent<
78
79
 
79
80
  return (
80
81
  <ClickAway onChange={onMenuToggle} clickAwayRef={clickAwayRef}>
81
- {({isOpen, onOpen, cancelNext, clickAway}) => (
82
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
82
83
  <div
83
84
  data-testid="Dropdown"
84
85
  className={classify(css.dropdownContainer, classNames?.wrapper)}
85
- ref={dropdownRef}
86
+ ref={mergeRefs([dropdownRef, boundaryRef])}
86
87
  >
87
88
  <Input
88
89
  {...inputProps}
@@ -92,7 +93,7 @@ export const Dropdown: React$AbstractComponent<
92
93
  isOpen ? clickAway() : onOpen();
93
94
  }
94
95
  }}
95
- boxRef={refs.setReference}
96
+ boxRef={mergeRefs([refs.setReference, triggerRef])}
96
97
  size={size}
97
98
  placeholder={placeholder}
98
99
  value={dropdownInputText}
@@ -108,8 +109,7 @@ export const Dropdown: React$AbstractComponent<
108
109
 
109
110
  {isOpen && menu && (
110
111
  <div
111
- onClickCapture={cancelNext}
112
- ref={refs.setFloating}
112
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
113
113
  style={{
114
114
  position: strategy,
115
115
  top: y ?? spaceNone,
@@ -9,6 +9,7 @@ var _react2 = require("@floating-ui/react");
9
9
  var _space = require("../../styles/variables/_space");
10
10
  var _classify = require("../../utils/classify");
11
11
  var _clickAway = require("../../utils/click-away");
12
+ var _mergeRefs = require("../../utils/merge-refs");
12
13
  var _Button = require("../Button");
13
14
  var _Icon = require("../Icon");
14
15
  var _Menu = require("../Menu");
@@ -56,8 +57,9 @@ const InlineDropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
56
57
  let {
57
58
  isOpen,
58
59
  onOpen,
59
- cancelNext,
60
- clickAway
60
+ clickAway,
61
+ boundaryRef,
62
+ triggerRef
61
63
  } = _ref2;
62
64
  return /*#__PURE__*/React.createElement("div", {
63
65
  "data-testid": "InlineDropdown",
@@ -65,7 +67,7 @@ const InlineDropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
65
67
  ref: menuBtnRef
66
68
  }, /*#__PURE__*/React.createElement(_Button.UnstyledButton, _extends({}, restButtonProps, {
67
69
  disabled: disabled,
68
- ref: refs.setReference,
70
+ ref: (0, _mergeRefs.mergeRefs)([refs.setReference, triggerRef]),
69
71
  onClick: e => {
70
72
  e.stopPropagation();
71
73
  onOpen();
@@ -81,8 +83,7 @@ const InlineDropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
81
83
  [_InlineDropdownModule.default.disabled]: disabled
82
84
  })
83
85
  })), isOpen && menu && /*#__PURE__*/React.createElement("div", {
84
- onClickCapture: cancelNext,
85
- ref: refs.setFloating,
86
+ ref: (0, _mergeRefs.mergeRefs)([refs.setFloating, boundaryRef]),
86
87
  style: {
87
88
  display: 'flex',
88
89
  position: strategy,
@@ -17,6 +17,7 @@ import {
17
17
  import {spaceNone, spaceXXSmall} from '../../styles/variables/_space';
18
18
  import {classify} from '../../utils/classify';
19
19
  import {type ClickAwayRefType, ClickAway} from '../../utils/click-away';
20
+ import {mergeRefs} from '../../utils/merge-refs';
20
21
  import type {UnstyledButtonProps} from '../Button';
21
22
  import {UnstyledButton} from '../Button';
22
23
  import type {AnchorType} from '../ButtonDropdown';
@@ -82,7 +83,7 @@ export const InlineDropdown: React$AbstractComponent<
82
83
 
83
84
  return (
84
85
  <ClickAway onChange={onMenuToggle} clickAwayRef={clickAwayRef}>
85
- {({isOpen, onOpen, cancelNext, clickAway}) => (
86
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
86
87
  <div
87
88
  data-testid="InlineDropdown"
88
89
  className={classify(
@@ -94,7 +95,7 @@ export const InlineDropdown: React$AbstractComponent<
94
95
  <UnstyledButton
95
96
  {...restButtonProps}
96
97
  disabled={disabled}
97
- ref={refs.setReference}
98
+ ref={mergeRefs([refs.setReference, triggerRef])}
98
99
  onClick={(e) => {
99
100
  e.stopPropagation();
100
101
  onOpen();
@@ -120,8 +121,7 @@ export const InlineDropdown: React$AbstractComponent<
120
121
  </UnstyledButton>
121
122
  {isOpen && menu && (
122
123
  <div
123
- onClickCapture={cancelNext}
124
- ref={refs.setFloating}
124
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
125
125
  style={{
126
126
  display: 'flex',
127
127
  position: strategy,
@@ -9,6 +9,7 @@ var _react2 = require("@floating-ui/react");
9
9
  var _space = require("../../../styles/variables/_space");
10
10
  var _classify = require("../../../utils/classify");
11
11
  var _clickAway = require("../../../utils/click-away");
12
+ var _mergeRefs = require("../../../utils/merge-refs");
12
13
  var _Menu = require("../../Menu");
13
14
  var _Tab = require("../Tab");
14
15
  var _TabDropdownModule = _interopRequireDefault(require("./TabDropdown.module.css"));
@@ -41,8 +42,9 @@ const TabDropdown = _ref => {
41
42
  let {
42
43
  isOpen,
43
44
  onOpen,
44
- cancelNext,
45
- clickAway
45
+ clickAway,
46
+ boundaryRef,
47
+ triggerRef
46
48
  } = _ref2;
47
49
  return /*#__PURE__*/React.createElement("div", {
48
50
  "data-testid": "TabDropdown",
@@ -50,7 +52,7 @@ const TabDropdown = _ref => {
50
52
  ref: menuBtnRef
51
53
  }, /*#__PURE__*/React.createElement(_Tab.Tab, _extends({}, props?.tab, {
52
54
  size: size,
53
- ref: refs.setReference,
55
+ ref: (0, _mergeRefs.mergeRefs)([refs.setReference, triggerRef]),
54
56
  onClick: e => {
55
57
  e.stopPropagation();
56
58
  onOpen();
@@ -60,8 +62,7 @@ const TabDropdown = _ref => {
60
62
  iconTextWrap: _TabDropdownModule.default.dotTextWrap
61
63
  }
62
64
  })), isOpen && props?.menu && /*#__PURE__*/React.createElement("div", {
63
- onClickCapture: cancelNext,
64
- ref: refs.setFloating,
65
+ ref: (0, _mergeRefs.mergeRefs)([refs.setFloating, boundaryRef]),
65
66
  style: {
66
67
  display: 'flex',
67
68
  position: strategy,
@@ -17,6 +17,7 @@ import {
17
17
  import {spaceNone, spaceXXSmall} from '../../../styles/variables/_space';
18
18
  import {classify} from '../../../utils/classify';
19
19
  import {ClickAway} from '../../../utils/click-away';
20
+ import {mergeRefs} from '../../../utils/merge-refs';
20
21
  import type {AnchorType} from '../../ButtonDropdown';
21
22
  import type {MenuOption, MenuProps} from '../../Menu';
22
23
  import {Menu} from '../../Menu';
@@ -59,7 +60,7 @@ export const TabDropdown = ({
59
60
 
60
61
  return (
61
62
  <ClickAway>
62
- {({isOpen, onOpen, cancelNext, clickAway}) => (
63
+ {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (
63
64
  <div
64
65
  data-testid="TabDropdown"
65
66
  className={classify(css.tabDropdownContainer, classNames?.wrapper)}
@@ -68,7 +69,7 @@ export const TabDropdown = ({
68
69
  <Tab
69
70
  {...props?.tab}
70
71
  size={size}
71
- ref={refs.setReference}
72
+ ref={mergeRefs([refs.setReference, triggerRef])}
72
73
  onClick={(e) => {
73
74
  e.stopPropagation();
74
75
  onOpen();
@@ -80,8 +81,7 @@ export const TabDropdown = ({
80
81
  />
81
82
  {isOpen && props?.menu && (
82
83
  <div
83
- onClickCapture={cancelNext}
84
- ref={refs.setFloating}
84
+ ref={mergeRefs([refs.setFloating, boundaryRef])}
85
85
  style={{
86
86
  display: 'flex',
87
87
  position: strategy,
@@ -68,13 +68,13 @@ const Typeahead = /*#__PURE__*/React.forwardRef((_ref, ref) => {
68
68
  let {
69
69
  isOpen,
70
70
  onOpen,
71
- cancelNext,
72
- clickAway
71
+ clickAway,
72
+ boundaryRef
73
73
  } = _ref2;
74
74
  return /*#__PURE__*/React.createElement("div", {
75
75
  "data-testid": "Typeahead",
76
76
  className: (0, _classify.classify)(_TypeaheadModule.default.typeaheadContainer, classNames?.wrapper),
77
- onClickCapture: cancelNext
77
+ ref: boundaryRef
78
78
  }, /*#__PURE__*/React.createElement(_SearchInput.SearchInput, _extends({}, inputProps, {
79
79
  ref: ref,
80
80
  boxRef: refs.setReference,
@@ -106,7 +106,6 @@ const Typeahead = /*#__PURE__*/React.forwardRef((_ref, ref) => {
106
106
  onClear?.();
107
107
  }
108
108
  })), isOpen && !isLoading && menu && filteredOptions && !!filteredOptions.length && /*#__PURE__*/React.createElement("div", {
109
- onClickCapture: cancelNext,
110
109
  ref: refs.setFloating,
111
110
  style: {
112
111
  position: strategy,
@@ -98,11 +98,11 @@ export const Typeahead: React$AbstractComponent<
98
98
 
99
99
  return (
100
100
  <ClickAway onChange={onMenuToggle} clickAwayRef={clickAwayRef}>
101
- {({isOpen, onOpen, cancelNext, clickAway}) => (
101
+ {({isOpen, onOpen, clickAway, boundaryRef}) => (
102
102
  <div
103
103
  data-testid="Typeahead"
104
104
  className={classify(css.typeaheadContainer, classNames?.wrapper)}
105
- onClickCapture={cancelNext}
105
+ ref={boundaryRef}
106
106
  >
107
107
  <SearchInput
108
108
  {...inputProps}
@@ -140,7 +140,6 @@ export const Typeahead: React$AbstractComponent<
140
140
  filteredOptions &&
141
141
  !!filteredOptions.length && (
142
142
  <div
143
- onClickCapture={cancelNext}
144
143
  ref={refs.setFloating}
145
144
  style={{
146
145
  position: strategy,
@@ -22,7 +22,8 @@ class ClickAway extends React.Component {
22
22
  pageBottom: null
23
23
  });
24
24
  _defineProperty(this, "el", null);
25
- _defineProperty(this, "cancelNext", false);
25
+ _defineProperty(this, "boundaryRef", /*#__PURE__*/React.createRef());
26
+ _defineProperty(this, "triggerRef", /*#__PURE__*/React.createRef());
26
27
  _defineProperty(this, "handleOpenClick", () => {
27
28
  // NOTE (kyle): we recalculate the position on click because sibling and niece components
28
29
  // could have changed.
@@ -33,21 +34,20 @@ class ClickAway extends React.Component {
33
34
  pageBottom = this.pageBottom();
34
35
  }
35
36
  this.setState({
36
- isOpen: true,
37
+ isOpen: !this.state.isOpen,
37
38
  pageBottom
38
39
  }, this.handleOnChange);
39
40
  });
40
41
  _defineProperty(this, "handleCloseClick", evt => {
41
- if (this.props.shouldCancel(evt)) {
42
+ if (evt.target instanceof Node && this.boundaryRef && (this.boundaryRef === evt.target || this.boundaryRef.current?.contains(evt.target))) {
42
43
  return;
43
44
  }
44
- if (this.cancelNext === true) {
45
- this.cancelNext = false;
46
- } else {
47
- this.setState({
48
- isOpen: false
49
- }, this.handleOnChange);
45
+ if (evt.target instanceof Node && this.triggerRef && (this.triggerRef === evt.target || this.triggerRef.current?.contains(evt.target))) {
46
+ return;
50
47
  }
48
+ this.setState({
49
+ isOpen: false
50
+ }, this.handleOnChange);
51
51
  });
52
52
  _defineProperty(this, "handleCloseOnEscapeKeypress", evt => {
53
53
  if (evt?.key === 'Escape') {
@@ -59,9 +59,6 @@ class ClickAway extends React.Component {
59
59
  isOpen: false
60
60
  }, this.handleOnChange);
61
61
  });
62
- _defineProperty(this, "cancelNextClickAway", () => {
63
- this.cancelNext = true;
64
- });
65
62
  _defineProperty(this, "handleOnChange", () => this.props.onChange && this.props.onChange(this.state.isOpen));
66
63
  }
67
64
  componentDidMount() {
@@ -78,18 +75,24 @@ class ClickAway extends React.Component {
78
75
  } = this.state;
79
76
  if (prevState.isOpen !== isOpen) {
80
77
  if (this.state.isOpen) {
81
- window.document.addEventListener('click', this.handleCloseClick);
78
+ window.document.addEventListener('click', this.handleCloseClick, {
79
+ capture: true
80
+ });
82
81
  if (this.props.closeOnEscapeKeypress) {
83
82
  window.document.addEventListener('keyup', this.handleCloseOnEscapeKeypress);
84
83
  }
85
84
  } else {
86
- window.document.removeEventListener('click', this.handleCloseClick);
85
+ window.document.removeEventListener('click', this.handleCloseClick, {
86
+ capture: true
87
+ });
87
88
  window.document.removeEventListener('keyup', this.handleCloseOnEscapeKeypress);
88
89
  }
89
90
  }
90
91
  }
91
92
  componentWillUnmount() {
92
- window.document.removeEventListener('click', this.handleCloseClick);
93
+ window.document.removeEventListener('click', this.handleCloseClick, {
94
+ capture: true
95
+ });
93
96
  window.document.removeEventListener('keyup', this.handleCloseOnEscapeKeypress);
94
97
  }
95
98
  render() {
@@ -112,9 +115,9 @@ class ClickAway extends React.Component {
112
115
  isOpen,
113
116
  height,
114
117
  pageBottom,
115
- cancelNext: this.cancelNextClickAway,
116
118
  clickAway: this.forceClose,
117
- anchorRef: el => this.el = el
119
+ boundaryRef: this.boundaryRef,
120
+ triggerRef: this.triggerRef
118
121
  });
119
122
  }
120
123
  pageBottom() {
@@ -125,6 +128,5 @@ class ClickAway extends React.Component {
125
128
  }
126
129
  exports.ClickAway = ClickAway;
127
130
  _defineProperty(ClickAway, "defaultProps", {
128
- shouldCancel: () => false,
129
131
  closeOnEscapeKeypress: true
130
132
  });
@@ -6,14 +6,22 @@ import invariant from 'invariant';
6
6
  import {pageHeight} from '../dom';
7
7
 
8
8
 
9
+ type BoundaryRefType<T> = {
10
+ current: ?T,
11
+ };
12
+
13
+ type TriggerRefType<T> = {
14
+ current: ?T,
15
+ };
16
+
9
17
  export type ChildProps = {
10
18
  onOpen: () => void,
11
19
  isOpen: boolean,
12
20
  height: ?number,
13
21
  pageBottom: ?number,
14
- cancelNext: () => void,
15
22
  clickAway: () => void,
16
- anchorRef: (?HTMLElement) => mixed,
23
+ boundaryRef: BoundaryRefType<?HTMLElement>,
24
+ triggerRef: TriggerRefType<?HTMLElement>,
17
25
  };
18
26
 
19
27
  export type ClickAwayRefType = ?{
@@ -26,7 +34,6 @@ export type ClickAwayRefType = ?{
26
34
  export type ClickAwayProps = {
27
35
  closeOnEscapeKeypress?: boolean,
28
36
  children: (props: ChildProps) => React.Node,
29
- shouldCancel: (event: MouseEvent) => boolean,
30
37
  onChange?: (isOpen: boolean) => mixed,
31
38
  clickAwayRef?: ClickAwayRefType,
32
39
  };
@@ -41,10 +48,8 @@ type ClickAwayState = {
41
48
 
42
49
  export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
43
50
  static defaultProps: {
44
- shouldCancel: () => boolean,
45
51
  closeOnEscapeKeypress?: boolean,
46
52
  } = {
47
- shouldCancel: () => false,
48
53
  closeOnEscapeKeypress: true,
49
54
  };
50
55
 
@@ -55,7 +60,8 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
55
60
  };
56
61
 
57
62
  el: ?HTMLElement = null;
58
- cancelNext: boolean = false;
63
+ boundaryRef: BoundaryRefType<?HTMLElement> = React.createRef();
64
+ triggerRef: TriggerRefType<?HTMLElement> = React.createRef();
59
65
 
60
66
  componentDidMount() {
61
67
  if (this.el) {
@@ -70,7 +76,9 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
70
76
  const {isOpen} = this.state;
71
77
  if (prevState.isOpen !== isOpen) {
72
78
  if (this.state.isOpen) {
73
- window.document.addEventListener('click', this.handleCloseClick);
79
+ window.document.addEventListener('click', this.handleCloseClick, {
80
+ capture: true,
81
+ });
74
82
  if (this.props.closeOnEscapeKeypress) {
75
83
  window.document.addEventListener(
76
84
  'keyup',
@@ -78,7 +86,9 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
78
86
  );
79
87
  }
80
88
  } else {
81
- window.document.removeEventListener('click', this.handleCloseClick);
89
+ window.document.removeEventListener('click', this.handleCloseClick, {
90
+ capture: true,
91
+ });
82
92
  window.document.removeEventListener(
83
93
  'keyup',
84
94
  this.handleCloseOnEscapeKeypress,
@@ -88,7 +98,9 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
88
98
  }
89
99
 
90
100
  componentWillUnmount() {
91
- window.document.removeEventListener('click', this.handleCloseClick);
101
+ window.document.removeEventListener('click', this.handleCloseClick, {
102
+ capture: true,
103
+ });
92
104
  window.document.removeEventListener(
93
105
  'keyup',
94
106
  this.handleCloseOnEscapeKeypress,
@@ -98,7 +110,6 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
98
110
  render(): React.Node {
99
111
  const {height, isOpen, pageBottom} = this.state;
100
112
  const {clickAwayRef} = this.props;
101
-
102
113
  if (clickAwayRef) {
103
114
  clickAwayRef.current = {
104
115
  forceClose: this.forceClose,
@@ -110,9 +121,9 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
110
121
  isOpen,
111
122
  height,
112
123
  pageBottom,
113
- cancelNext: this.cancelNextClickAway,
114
124
  clickAway: this.forceClose,
115
- anchorRef: (el) => (this.el = el),
125
+ boundaryRef: this.boundaryRef,
126
+ triggerRef: this.triggerRef,
116
127
  });
117
128
  }
118
129
 
@@ -126,7 +137,7 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
126
137
 
127
138
  this.setState(
128
139
  {
129
- isOpen: true,
140
+ isOpen: !this.state.isOpen,
130
141
  pageBottom,
131
142
  },
132
143
  this.handleOnChange,
@@ -134,20 +145,30 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
134
145
  };
135
146
 
136
147
  handleCloseClick: (evt: MouseEvent) => void = (evt: MouseEvent) => {
137
- if (this.props.shouldCancel(evt)) {
148
+ if (
149
+ evt.target instanceof Node &&
150
+ this.boundaryRef &&
151
+ (this.boundaryRef === evt.target ||
152
+ this.boundaryRef.current?.contains(evt.target))
153
+ ) {
138
154
  return;
139
155
  }
140
156
 
141
- if (this.cancelNext === true) {
142
- this.cancelNext = false;
143
- } else {
144
- this.setState(
145
- {
146
- isOpen: false,
147
- },
148
- this.handleOnChange,
149
- );
157
+ if (
158
+ evt.target instanceof Node &&
159
+ this.triggerRef &&
160
+ (this.triggerRef === evt.target ||
161
+ this.triggerRef.current?.contains(evt.target))
162
+ ) {
163
+ return;
150
164
  }
165
+
166
+ this.setState(
167
+ {
168
+ isOpen: false,
169
+ },
170
+ this.handleOnChange,
171
+ );
151
172
  };
152
173
 
153
174
  handleCloseOnEscapeKeypress: (
@@ -162,10 +183,6 @@ export class ClickAway extends React.Component<ClickAwayProps, ClickAwayState> {
162
183
  this.setState({isOpen: false}, this.handleOnChange);
163
184
  };
164
185
 
165
- cancelNextClickAway: () => void = () => {
166
- this.cancelNext = true;
167
- };
168
-
169
186
  handleOnChange: () => mixed = () =>
170
187
  this.props.onChange && this.props.onChange(this.state.isOpen);
171
188
 
@@ -1,7 +1,7 @@
1
1
  // @flow strict
2
2
  export function mergeRefs(
3
- refs: Array<{current: ?HTMLElement, ...}>,
4
- ): (value: empty) => void {
3
+ refs: Array<{current: ?HTMLElement}>,
4
+ ): (value: ?HTMLElement) => void {
5
5
  return (value) => {
6
6
  refs.forEach((ref) => {
7
7
  if (typeof ref === 'function') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaced-out/ui-design-system",
3
- "version": "0.1.130",
3
+ "version": "0.2.0",
4
4
  "main": "index.js",
5
5
  "description": "Sense UI components library",
6
6
  "author": {
@@ -104,8 +104,8 @@
104
104
  "node-sass": "^7.0.0",
105
105
  "paths.macro": "^3.0.1",
106
106
  "prettier": "^2.5.1",
107
- "react": "^16.14.0",
108
- "react-dom": "^16.14.0",
107
+ "react": "17.0.2",
108
+ "react-dom": "17.0.2",
109
109
  "rimraf": "^3.0.2",
110
110
  "simple-git": "^3.12.0",
111
111
  "standard-version": "^9.5.0",