@spaced-out/ui-design-system 0.1.130-beta.0 → 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.
Files changed (35) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/design-tokens/color/app-color.json +22 -0
  3. package/lib/components/ButtonDropdown/ButtonDropdown.js +6 -5
  4. package/lib/components/ButtonDropdown/ButtonDropdown.js.flow +4 -4
  5. package/lib/components/ButtonTabs/ButtonTabDropdown.js +6 -5
  6. package/lib/components/ButtonTabs/ButtonTabDropdown.js.flow +4 -4
  7. package/lib/components/Dropdown/Dropdown.js +7 -6
  8. package/lib/components/Dropdown/Dropdown.js.flow +5 -5
  9. package/lib/components/InlineDropdown/InlineDropdown.js +6 -5
  10. package/lib/components/InlineDropdown/InlineDropdown.js.flow +4 -4
  11. package/lib/components/ScoreBar/ScoreBar.js +64 -0
  12. package/lib/components/ScoreBar/ScoreBar.js.flow +117 -0
  13. package/lib/components/ScoreBar/ScoreBar.module.css +36 -0
  14. package/lib/components/ScoreBar/index.js +16 -0
  15. package/lib/components/ScoreBar/index.js.flow +3 -0
  16. package/lib/components/Tabs/TabList/TabDropdown.js +6 -5
  17. package/lib/components/Tabs/TabList/TabDropdown.js.flow +4 -4
  18. package/lib/components/Typeahead/Typeahead.js +3 -4
  19. package/lib/components/Typeahead/Typeahead.js.flow +2 -3
  20. package/lib/styles/index.css +12 -0
  21. package/lib/styles/index.js +15 -3
  22. package/lib/styles/index.js.flow +12 -0
  23. package/lib/styles/variables/_color.css +12 -0
  24. package/lib/styles/variables/_color.js +14 -1
  25. package/lib/styles/variables/_color.js.flow +12 -0
  26. package/lib/utils/click-away/click-away.js +20 -18
  27. package/lib/utils/click-away/click-away.js.flow +44 -27
  28. package/lib/utils/index.js +11 -0
  29. package/lib/utils/index.js.flow +1 -0
  30. package/lib/utils/merge-refs/merge-refs.js.flow +2 -2
  31. package/lib/utils/score-bar/index.js +16 -0
  32. package/lib/utils/score-bar/index.js.flow +3 -0
  33. package/lib/utils/score-bar/score-bar.js +27 -0
  34. package/lib/utils/score-bar/score-bar.js.flow +33 -0
  35. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
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
+
12
+ ### [0.1.130](https://github.com/spaced-out/ui-design-system/compare/v0.1.130-beta.0...v0.1.130) (2024-09-12)
13
+
14
+
15
+ ### Features
16
+
17
+ * score bar component ([#265](https://github.com/spaced-out/ui-design-system/issues/265)) ([d3adc39](https://github.com/spaced-out/ui-design-system/commit/d3adc3906bf88c8d110d5a65cc6bbbe5cc6c3c23))
18
+
5
19
  ### [0.1.130-beta.0](https://github.com/spaced-out/ui-design-system/compare/v0.1.129...v0.1.130-beta.0) (2024-09-11)
6
20
 
7
21
 
@@ -255,6 +255,28 @@
255
255
  "value": "{baseColor.yellow.100.value}"
256
256
  }
257
257
  },
258
+ "score-bar": {
259
+ "level": {
260
+ "1": {
261
+ "value": "{baseColor.red.400.value}"
262
+ },
263
+ "2": {
264
+ "value": "{baseColor.orange.400.value}"
265
+ },
266
+ "3": {
267
+ "value": "{baseColor.blue.400.value}"
268
+ },
269
+ "4": {
270
+ "value": "{baseColor.green.300.value}"
271
+ },
272
+ "5": {
273
+ "value": "{baseColor.green.700.value}"
274
+ }
275
+ },
276
+ "inactive": {
277
+ "value": "{baseColor.indigo.200.value}"
278
+ }
279
+ },
258
280
  "gray.lightest": {
259
281
  "value": "{baseColor.gray.75.value}"
260
282
  },
@@ -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,
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ScoreBar = exports.Direction = exports.DEFAULT_COLOR_MAP = void 0;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ var _invariant = _interopRequireDefault(require("invariant"));
9
+ var _clamp = _interopRequireDefault(require("lodash/clamp"));
10
+ var _color = require("../../styles/variables/_color.js");
11
+ var _size = require("../../styles/variables/_size");
12
+ var _classify = require("../../utils/classify");
13
+ var _scoreBar = require("../../utils/score-bar");
14
+ var _ScoreBarModule = _interopRequireDefault(require("./ScoreBar.module.css"));
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+
19
+ const Direction = Object.freeze({
20
+ horizontal: 'horizontal',
21
+ vertical: 'vertical'
22
+ });
23
+ exports.Direction = Direction;
24
+ const DEFAULT_BARS_COUNT = 5;
25
+ const DEFAULT_COLOR_MAP = {
26
+ inactive: _color.colorScoreBarInactive,
27
+ '100': _color.colorScoreBarLevel5,
28
+ '80': _color.colorScoreBarLevel4,
29
+ '60': _color.colorScoreBarLevel3,
30
+ '40': _color.colorScoreBarLevel2,
31
+ '20': _color.colorScoreBarLevel1
32
+ };
33
+ exports.DEFAULT_COLOR_MAP = DEFAULT_COLOR_MAP;
34
+ const ScoreBar = /*#__PURE__*/React.forwardRef((_ref, ref) => {
35
+ let {
36
+ score = 0,
37
+ colorMap = DEFAULT_COLOR_MAP,
38
+ totalBars = DEFAULT_BARS_COUNT,
39
+ direction = 'vertical',
40
+ classNames
41
+ } = _ref;
42
+ (0, _invariant.default)(totalBars > 0, JSON.stringify(_scoreBar.SCORE_BAR_ERRORS.INVALID_BAR_COUNT));
43
+ return /*#__PURE__*/React.createElement("div", {
44
+ ref: ref,
45
+ "data-testid": "ScoreBar",
46
+ className: (0, _classify.classify)(_ScoreBarModule.default.scoreBarWrapper, classNames?.wrapper)
47
+ }, /*#__PURE__*/React.createElement("div", {
48
+ className: (0, _classify.classify)(_ScoreBarModule.default.scoreBarContainer, classNames?.container),
49
+ style: {
50
+ '--direction': direction === Direction.horizontal ? 'row-reverse' : 'column',
51
+ '--height': direction === Direction.horizontal ? _size.size18 : 'unset',
52
+ '--width': direction === Direction.vertical ? _size.size18 : 'unset'
53
+ }
54
+ }, [...Array(totalBars).keys()].reverse().map(count => /*#__PURE__*/React.createElement("div", {
55
+ className: (0, _classify.classify)(_ScoreBarModule.default.bar, classNames?.bar),
56
+ style: {
57
+ '--background-color': (0, _scoreBar.getColorByScorePercentage)(totalBars, (0, _clamp.default)(score, 0, totalBars), count, colorMap),
58
+ '--height': direction === Direction.horizontal ? _size.size18 : _size.size2,
59
+ '--width': direction === Direction.vertical ? _size.size18 : _size.size2
60
+ },
61
+ key: count
62
+ }))));
63
+ });
64
+ exports.ScoreBar = ScoreBar;
@@ -0,0 +1,117 @@
1
+ // @flow strict
2
+
3
+ import * as React from 'react';
4
+ import invariant from 'invariant';
5
+ import clamp from 'lodash/clamp';
6
+
7
+ import {
8
+ colorScoreBarInactive,
9
+ colorScoreBarLevel1,
10
+ colorScoreBarLevel2,
11
+ colorScoreBarLevel3,
12
+ colorScoreBarLevel4,
13
+ colorScoreBarLevel5,
14
+ } from '../../styles/variables/_color.js';
15
+ import {size2, size18} from '../../styles/variables/_size';
16
+ import {classify} from '../../utils/classify';
17
+ import {
18
+ getColorByScorePercentage,
19
+ SCORE_BAR_ERRORS,
20
+ } from '../../utils/score-bar';
21
+
22
+ import css from './ScoreBar.module.css';
23
+
24
+
25
+ export const Direction = Object.freeze({
26
+ horizontal: 'horizontal',
27
+ vertical: 'vertical',
28
+ });
29
+
30
+ export type ClassNames = $ReadOnly<{
31
+ container?: string,
32
+ wrapper?: string,
33
+ bar?: string,
34
+ }>;
35
+
36
+ export type ScoreBarDirection = $Values<typeof Direction>;
37
+ export type ScoreBarColorMap = $ReadOnly<{
38
+ inactive: string, // percentage > score
39
+ '100': string, // score > 80%
40
+ '80': string, // score > 60% and score <= %80
41
+ '60': string, // score > 40% and score <= %60
42
+ '40': string, // score > 20% and score <= 40%
43
+ '20': string, // score > 0% and score <= 20%
44
+ }>;
45
+
46
+ export type ScoreBarProps = {
47
+ classNames?: ClassNames,
48
+ direction?: ScoreBarDirection,
49
+ colorMap?: ScoreBarColorMap,
50
+ totalBars?: number,
51
+ score?: number,
52
+ };
53
+
54
+ const DEFAULT_BARS_COUNT = 5;
55
+ export const DEFAULT_COLOR_MAP: ScoreBarColorMap = {
56
+ inactive: colorScoreBarInactive,
57
+ '100': colorScoreBarLevel5,
58
+ '80': colorScoreBarLevel4,
59
+ '60': colorScoreBarLevel3,
60
+ '40': colorScoreBarLevel2,
61
+ '20': colorScoreBarLevel1,
62
+ };
63
+
64
+ export const ScoreBar: React$AbstractComponent<ScoreBarProps, HTMLDivElement> =
65
+ React.forwardRef<ScoreBarProps, HTMLDivElement>(
66
+ (
67
+ {
68
+ score = 0,
69
+ colorMap = DEFAULT_COLOR_MAP,
70
+ totalBars = DEFAULT_BARS_COUNT,
71
+ direction = 'vertical',
72
+ classNames,
73
+ }: ScoreBarProps,
74
+ ref,
75
+ ): React.Node => {
76
+ invariant(
77
+ totalBars > 0,
78
+ JSON.stringify(SCORE_BAR_ERRORS.INVALID_BAR_COUNT),
79
+ );
80
+
81
+ return (
82
+ <div
83
+ ref={ref}
84
+ data-testid="ScoreBar"
85
+ className={classify(css.scoreBarWrapper, classNames?.wrapper)}
86
+ >
87
+ <div
88
+ className={classify(css.scoreBarContainer, classNames?.container)}
89
+ style={{
90
+ '--direction':
91
+ direction === Direction.horizontal ? 'row-reverse' : 'column',
92
+ '--height': direction === Direction.horizontal ? size18 : 'unset',
93
+ '--width': direction === Direction.vertical ? size18 : 'unset',
94
+ }}
95
+ >
96
+ {[...Array(totalBars).keys()].reverse().map((count) => (
97
+ <div
98
+ className={classify(css.bar, classNames?.bar)}
99
+ style={{
100
+ '--background-color': getColorByScorePercentage(
101
+ totalBars,
102
+ clamp(score, 0, totalBars),
103
+ count,
104
+ colorMap,
105
+ ),
106
+ '--height':
107
+ direction === Direction.horizontal ? size18 : size2,
108
+ '--width': direction === Direction.vertical ? size18 : size2,
109
+ }}
110
+ key={count}
111
+ />
112
+ ))}
113
+ </div>
114
+ </div>
115
+ );
116
+ },
117
+ );
@@ -0,0 +1,36 @@
1
+ @value (
2
+ borderRadiusXSmall
3
+ ) from '../../styles/variables/_border.css';
4
+ @value (
5
+ size34,
6
+ size18,
7
+ size2
8
+ ) from '../../styles/variables/_size.css';
9
+ @value (
10
+ spaceXXSmall,
11
+ spaceXSmall
12
+ ) from '../../styles/variables/_space.css';
13
+
14
+ .scoreBarWrapper {
15
+ display: flex;
16
+ padding: spaceXSmall;
17
+ align-items: center;
18
+ justify-content: center;
19
+ }
20
+
21
+ .scoreBarContainer {
22
+ width: var(--width);
23
+ height: var(--height);
24
+ gap: calc(spaceXXSmall / 2);
25
+ display: flex;
26
+ flex-direction: var(--direction);
27
+ justify-content: space-between;
28
+ align-items: center;
29
+ }
30
+
31
+ .bar {
32
+ width: var(--width);
33
+ height: var(--height);
34
+ border-radius: borderRadiusXSmall;
35
+ background-color: var(--background-color);
36
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _ScoreBar = require("./ScoreBar");
7
+ Object.keys(_ScoreBar).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _ScoreBar[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _ScoreBar[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,3 @@
1
+ // @flow strict
2
+
3
+ export * from './ScoreBar';
@@ -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,