baseui 10.9.0 → 10.9.1

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 (39) hide show
  1. package/data-table/column-numerical.js +355 -307
  2. package/data-table/column-numerical.js.flow +287 -273
  3. package/data-table/constants.js +11 -17
  4. package/data-table/constants.js.flow +8 -11
  5. package/data-table/data-table.js +50 -53
  6. package/data-table/data-table.js.flow +13 -18
  7. package/data-table/filter-shell.js +4 -27
  8. package/data-table/filter-shell.js.flow +9 -33
  9. package/data-table/locale.js +2 -4
  10. package/data-table/locale.js.flow +2 -6
  11. package/data-table/measure-column-widths.js +121 -83
  12. package/data-table/measure-column-widths.js.flow +109 -87
  13. package/es/data-table/column-numerical.js +317 -245
  14. package/es/data-table/constants.js +8 -12
  15. package/es/data-table/data-table.js +16 -18
  16. package/es/data-table/filter-shell.js +4 -26
  17. package/es/data-table/locale.js +2 -4
  18. package/es/data-table/measure-column-widths.js +86 -75
  19. package/es/form-control/form-control.js +58 -7
  20. package/es/form-control/styled-components.js +27 -6
  21. package/es/popover/popover.js +1 -1
  22. package/esm/data-table/column-numerical.js +353 -304
  23. package/esm/data-table/constants.js +8 -12
  24. package/esm/data-table/data-table.js +50 -53
  25. package/esm/data-table/filter-shell.js +4 -26
  26. package/esm/data-table/locale.js +2 -4
  27. package/esm/data-table/measure-column-widths.js +121 -83
  28. package/esm/form-control/form-control.js +60 -9
  29. package/esm/form-control/styled-components.js +23 -3
  30. package/esm/popover/popover.js +1 -1
  31. package/form-control/form-control.js +61 -8
  32. package/form-control/form-control.js.flow +82 -10
  33. package/form-control/index.d.ts +1 -0
  34. package/form-control/styled-components.js +27 -5
  35. package/form-control/styled-components.js.flow +25 -3
  36. package/form-control/types.js.flow +20 -8
  37. package/package.json +1 -2
  38. package/popover/popover.js +1 -1
  39. package/popover/popover.js.flow +1 -1
@@ -1,7 +1,7 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2
-
3
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
2
 
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
+
5
5
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
6
 
7
7
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -33,7 +33,7 @@ LICENSE file in the root directory of this source tree.
33
33
  import * as React from 'react';
34
34
  import { getOverride, getOverrideProps } from '../helpers/overrides.js';
35
35
  import { UIDConsumer } from 'react-uid';
36
- import { Label as StyledLabel, Caption as StyledCaption, ControlContainer as StyledControlContainer } from './styled-components.js';
36
+ import { Label as StyledLabel, LabelEndEnhancer as StyledLabelEndEnhancer, LabelContainer as StyledLabelContainer, Caption as StyledCaption, ControlContainer as StyledControlContainer } from './styled-components.js';
37
37
 
38
38
  function chooseRenderedHint(caption, error, positive, sharedProps) {
39
39
  if (error && typeof error !== 'boolean') {
@@ -68,6 +68,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
68
68
  var _this$props = this.props,
69
69
  _this$props$overrides = _this$props.overrides,
70
70
  LabelOverride = _this$props$overrides.Label,
71
+ LabelEndEnhancerOverride = _this$props$overrides.LabelEndEnhancer,
72
+ LabelContainerOverride = _this$props$overrides.LabelContainer,
71
73
  CaptionOverride = _this$props$overrides.Caption,
72
74
  ControlContainerOverride = _this$props$overrides.ControlContainer,
73
75
  label = _this$props.label,
@@ -76,7 +78,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
76
78
  error = _this$props.error,
77
79
  positive = _this$props.positive,
78
80
  htmlFor = _this$props.htmlFor,
79
- children = _this$props.children;
81
+ children = _this$props.children,
82
+ counter = _this$props.counter;
80
83
  var onlyChildProps = React.Children.only(children).props;
81
84
  var sharedProps = {
82
85
  $disabled: !!disabled,
@@ -84,6 +87,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
84
87
  $positive: !!positive
85
88
  };
86
89
  var Label = getOverride(LabelOverride) || StyledLabel;
90
+ var LabelEndEnhancer = getOverride(LabelEndEnhancerOverride) || StyledLabelEndEnhancer;
91
+ var LabelContainer = getOverride(LabelContainerOverride) || StyledLabelContainer;
87
92
  var Caption = getOverride(CaptionOverride) || StyledCaption;
88
93
  var ControlContainer = getOverride(ControlContainerOverride) || StyledControlContainer;
89
94
  var hint = chooseRenderedHint(caption, error, positive, sharedProps);
@@ -95,10 +100,55 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
95
100
  }
96
101
  }
97
102
 
98
- return /*#__PURE__*/React.createElement(React.Fragment, null, label && /*#__PURE__*/React.createElement(Label, _extends({
103
+ var labelEndEnhancer = this.props.labelEndEnhancer;
104
+
105
+ if (counter) {
106
+ // inferred values are preferred but if the user specifies the value
107
+ // that is then used as the default.
108
+ var maxLength = null;
109
+ var length = null;
110
+ var counterError = null;
111
+
112
+ if (_typeof(counter) === 'object') {
113
+ length = counter.length;
114
+ maxLength = counter.maxLength;
115
+ counterError = counter.error;
116
+ }
117
+
118
+ maxLength = maxLength ? maxLength : onlyChildProps.maxLength;
119
+
120
+ if (length == null && typeof onlyChildProps.value === 'string') {
121
+ length = onlyChildProps.value.length;
122
+ }
123
+
124
+ if (length == null) {
125
+ length = 0;
126
+
127
+ if (process.env.NODE_ENV !== "production") {
128
+ console.warn("[FromControl] `length` must either be explicitly set via `counter` object property, or `value` string property on the child component.");
129
+ }
130
+ }
131
+
132
+ sharedProps.$length = length;
133
+
134
+ if (maxLength == null) {
135
+ if (!labelEndEnhancer) labelEndEnhancer = "".concat(length);
136
+ } else {
137
+ sharedProps.$maxLength = length;
138
+ if (!labelEndEnhancer) labelEndEnhancer = "".concat(length, "/").concat(maxLength);
139
+ if (length > maxLength && counterError == null) counterError = true;
140
+ }
141
+
142
+ if (counterError) {
143
+ sharedProps.$error = true;
144
+ sharedProps.$counterError = true;
145
+ }
146
+ }
147
+
148
+ return /*#__PURE__*/React.createElement(React.Fragment, null, label && /*#__PURE__*/React.createElement(LabelContainer, _extends({}, sharedProps, getOverrideProps(LabelContainerOverride)), /*#__PURE__*/React.createElement(Label, _extends({
99
149
  "data-baseweb": "form-control-label",
100
150
  htmlFor: htmlFor || onlyChildProps.id
101
- }, sharedProps, getOverrideProps(LabelOverride)), typeof label === 'function' ? label(sharedProps) : label), /*#__PURE__*/React.createElement(UIDConsumer, null, function (captionId) {
151
+ }, sharedProps, getOverrideProps(LabelOverride)), typeof label === 'function' ? label(sharedProps) : label), labelEndEnhancer && /*#__PURE__*/React.createElement(LabelEndEnhancer, _extends({}, sharedProps, getOverrideProps(LabelEndEnhancerOverride)), typeof labelEndEnhancer === 'function' ? labelEndEnhancer(sharedProps) : labelEndEnhancer)), /*#__PURE__*/React.createElement(UIDConsumer, null, function (captionId) {
102
152
  return /*#__PURE__*/React.createElement(ControlContainer, _extends({
103
153
  "data-baseweb": "form-control-container"
104
154
  }, sharedProps, getOverrideProps(ControlContainerOverride)), React.Children.map(children, function (child, index) {
@@ -109,8 +159,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
109
159
  'aria-errormessage': error ? captionId : null,
110
160
  'aria-describedby': caption || positive ? captionId : null,
111
161
  disabled: onlyChildProps.disabled || disabled,
112
- error: typeof onlyChildProps.error !== 'undefined' ? onlyChildProps.error : error,
113
- positive: typeof onlyChildProps.positive !== 'undefined' ? onlyChildProps.positive : positive
162
+ error: typeof onlyChildProps.error !== 'undefined' ? onlyChildProps.error : sharedProps.$error,
163
+ positive: typeof onlyChildProps.positive !== 'undefined' ? onlyChildProps.positive : sharedProps.$positive
114
164
  });
115
165
  }), (caption || error || positive) && /*#__PURE__*/React.createElement(Caption, _extends({
116
166
  "data-baseweb": "form-control-caption",
@@ -127,7 +177,8 @@ _defineProperty(FormControl, "defaultProps", {
127
177
  overrides: {},
128
178
  label: null,
129
179
  caption: null,
130
- disabled: false
180
+ disabled: false,
181
+ counter: false
131
182
  });
132
183
 
133
184
  export { FormControl as default };
@@ -15,7 +15,6 @@ export var Label = styled('label', function (props) {
15
15
  var $disabled = props.$disabled,
16
16
  _props$$theme = props.$theme,
17
17
  colors = _props$$theme.colors,
18
- sizing = _props$$theme.sizing,
19
18
  typography = _props$$theme.typography;
20
19
  return _objectSpread(_objectSpread({}, typography.font250), {}, {
21
20
  fontWeight: 500,
@@ -25,14 +24,35 @@ export var Label = styled('label', function (props) {
25
24
  paddingTop: 0,
26
25
  paddingRight: 0,
27
26
  paddingBottom: 0,
28
- paddingLeft: 0,
27
+ paddingLeft: 0
28
+ });
29
+ });
30
+ Label.displayName = "Label";
31
+ export var LabelContainer = styled('span', function (_ref) {
32
+ var sizing = _ref.$theme.sizing;
33
+ return {
34
+ display: 'flex',
35
+ width: '100%',
29
36
  marginTop: sizing.scale300,
30
37
  marginRight: 0,
31
38
  marginBottom: sizing.scale300,
32
39
  marginLeft: 0
40
+ };
41
+ });
42
+ LabelContainer.displayName = "LabelContainer";
43
+ export var LabelEndEnhancer = styled('span', function (_ref2) {
44
+ var $disabled = _ref2.$disabled,
45
+ $counterError = _ref2.$counterError,
46
+ _ref2$$theme = _ref2.$theme,
47
+ colors = _ref2$$theme.colors,
48
+ typography = _ref2$$theme.typography;
49
+ return _objectSpread(_objectSpread({}, typography.font100), {}, {
50
+ flex: 0,
51
+ width: '100%',
52
+ color: $counterError ? colors.negative400 : $disabled ? colors.contentSecondary : colors.contentPrimary
33
53
  });
34
54
  });
35
- Label.displayName = "Label";
55
+ LabelEndEnhancer.displayName = "LabelEndEnhancer";
36
56
  export var Caption = styled('div', function (props) {
37
57
  var $error = props.$error,
38
58
  $positive = props.$positive,
@@ -520,7 +520,7 @@ var PopoverInner = /*#__PURE__*/function (_React$Component) {
520
520
  crossFrame: false,
521
521
  focusOptions: this.props.focusOptions
522
522
  }, this.renderPopover(renderedContent)) : /*#__PURE__*/React.createElement(MoveFocusInside, {
523
- disabled: !this.props.autoFocus && !this.state.autoFocusAfterPositioning
523
+ disabled: !this.props.autoFocus || !this.state.autoFocusAfterPositioning
524
524
  }, this.renderPopover(renderedContent)))));
525
525
  } else {
526
526
  rendered.push( /*#__PURE__*/React.createElement(Hidden, {
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -21,6 +19,8 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
21
19
 
22
20
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
23
21
 
22
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
23
+
24
24
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
25
25
 
26
26
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -76,6 +76,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
76
76
  var _this$props = this.props,
77
77
  _this$props$overrides = _this$props.overrides,
78
78
  LabelOverride = _this$props$overrides.Label,
79
+ LabelEndEnhancerOverride = _this$props$overrides.LabelEndEnhancer,
80
+ LabelContainerOverride = _this$props$overrides.LabelContainer,
79
81
  CaptionOverride = _this$props$overrides.Caption,
80
82
  ControlContainerOverride = _this$props$overrides.ControlContainer,
81
83
  label = _this$props.label,
@@ -84,7 +86,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
84
86
  error = _this$props.error,
85
87
  positive = _this$props.positive,
86
88
  htmlFor = _this$props.htmlFor,
87
- children = _this$props.children;
89
+ children = _this$props.children,
90
+ counter = _this$props.counter;
88
91
  var onlyChildProps = React.Children.only(children).props;
89
92
  var sharedProps = {
90
93
  $disabled: !!disabled,
@@ -94,6 +97,10 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
94
97
 
95
98
  var Label = (0, _overrides.getOverride)(LabelOverride) || _styledComponents.Label;
96
99
 
100
+ var LabelEndEnhancer = (0, _overrides.getOverride)(LabelEndEnhancerOverride) || _styledComponents.LabelEndEnhancer;
101
+
102
+ var LabelContainer = (0, _overrides.getOverride)(LabelContainerOverride) || _styledComponents.LabelContainer;
103
+
97
104
  var Caption = (0, _overrides.getOverride)(CaptionOverride) || _styledComponents.Caption;
98
105
 
99
106
  var ControlContainer = (0, _overrides.getOverride)(ControlContainerOverride) || _styledComponents.ControlContainer;
@@ -107,10 +114,55 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
107
114
  }
108
115
  }
109
116
 
110
- return /*#__PURE__*/React.createElement(React.Fragment, null, label && /*#__PURE__*/React.createElement(Label, _extends({
117
+ var labelEndEnhancer = this.props.labelEndEnhancer;
118
+
119
+ if (counter) {
120
+ // inferred values are preferred but if the user specifies the value
121
+ // that is then used as the default.
122
+ var maxLength = null;
123
+ var length = null;
124
+ var counterError = null;
125
+
126
+ if (_typeof(counter) === 'object') {
127
+ length = counter.length;
128
+ maxLength = counter.maxLength;
129
+ counterError = counter.error;
130
+ }
131
+
132
+ maxLength = maxLength ? maxLength : onlyChildProps.maxLength;
133
+
134
+ if (length == null && typeof onlyChildProps.value === 'string') {
135
+ length = onlyChildProps.value.length;
136
+ }
137
+
138
+ if (length == null) {
139
+ length = 0;
140
+
141
+ if (process.env.NODE_ENV !== "production") {
142
+ console.warn("[FromControl] `length` must either be explicitly set via `counter` object property, or `value` string property on the child component.");
143
+ }
144
+ }
145
+
146
+ sharedProps.$length = length;
147
+
148
+ if (maxLength == null) {
149
+ if (!labelEndEnhancer) labelEndEnhancer = "".concat(length);
150
+ } else {
151
+ sharedProps.$maxLength = length;
152
+ if (!labelEndEnhancer) labelEndEnhancer = "".concat(length, "/").concat(maxLength);
153
+ if (length > maxLength && counterError == null) counterError = true;
154
+ }
155
+
156
+ if (counterError) {
157
+ sharedProps.$error = true;
158
+ sharedProps.$counterError = true;
159
+ }
160
+ }
161
+
162
+ return /*#__PURE__*/React.createElement(React.Fragment, null, label && /*#__PURE__*/React.createElement(LabelContainer, _extends({}, sharedProps, (0, _overrides.getOverrideProps)(LabelContainerOverride)), /*#__PURE__*/React.createElement(Label, _extends({
111
163
  "data-baseweb": "form-control-label",
112
164
  htmlFor: htmlFor || onlyChildProps.id
113
- }, sharedProps, (0, _overrides.getOverrideProps)(LabelOverride)), typeof label === 'function' ? label(sharedProps) : label), /*#__PURE__*/React.createElement(_reactUid.UIDConsumer, null, function (captionId) {
165
+ }, sharedProps, (0, _overrides.getOverrideProps)(LabelOverride)), typeof label === 'function' ? label(sharedProps) : label), labelEndEnhancer && /*#__PURE__*/React.createElement(LabelEndEnhancer, _extends({}, sharedProps, (0, _overrides.getOverrideProps)(LabelEndEnhancerOverride)), typeof labelEndEnhancer === 'function' ? labelEndEnhancer(sharedProps) : labelEndEnhancer)), /*#__PURE__*/React.createElement(_reactUid.UIDConsumer, null, function (captionId) {
114
166
  return /*#__PURE__*/React.createElement(ControlContainer, _extends({
115
167
  "data-baseweb": "form-control-container"
116
168
  }, sharedProps, (0, _overrides.getOverrideProps)(ControlContainerOverride)), React.Children.map(children, function (child, index) {
@@ -121,8 +173,8 @@ var FormControl = /*#__PURE__*/function (_React$Component) {
121
173
  'aria-errormessage': error ? captionId : null,
122
174
  'aria-describedby': caption || positive ? captionId : null,
123
175
  disabled: onlyChildProps.disabled || disabled,
124
- error: typeof onlyChildProps.error !== 'undefined' ? onlyChildProps.error : error,
125
- positive: typeof onlyChildProps.positive !== 'undefined' ? onlyChildProps.positive : positive
176
+ error: typeof onlyChildProps.error !== 'undefined' ? onlyChildProps.error : sharedProps.$error,
177
+ positive: typeof onlyChildProps.positive !== 'undefined' ? onlyChildProps.positive : sharedProps.$positive
126
178
  });
127
179
  }), (caption || error || positive) && /*#__PURE__*/React.createElement(Caption, _extends({
128
180
  "data-baseweb": "form-control-caption",
@@ -141,5 +193,6 @@ _defineProperty(FormControl, "defaultProps", {
141
193
  overrides: {},
142
194
  label: null,
143
195
  caption: null,
144
- disabled: false
196
+ disabled: false,
197
+ counter: false
145
198
  });
@@ -11,10 +11,16 @@ import {getOverride, getOverrideProps} from '../helpers/overrides.js';
11
11
  import {UIDConsumer} from 'react-uid';
12
12
  import {
13
13
  Label as StyledLabel,
14
+ LabelEndEnhancer as StyledLabelEndEnhancer,
15
+ LabelContainer as StyledLabelContainer,
14
16
  Caption as StyledCaption,
15
17
  ControlContainer as StyledControlContainer,
16
18
  } from './styled-components.js';
17
- import type {FormControlPropsT, FormControlStateT} from './types.js';
19
+ import type {
20
+ FormControlPropsT,
21
+ FormControlStateT,
22
+ StylePropsT,
23
+ } from './types.js';
18
24
 
19
25
  function chooseRenderedHint(caption, error, positive, sharedProps) {
20
26
  if (error && typeof error !== 'boolean') {
@@ -41,12 +47,15 @@ export default class FormControl extends React.Component<
41
47
  label: null,
42
48
  caption: null,
43
49
  disabled: false,
50
+ counter: false,
44
51
  };
45
52
 
46
53
  render() {
47
54
  const {
48
55
  overrides: {
49
56
  Label: LabelOverride,
57
+ LabelEndEnhancer: LabelEndEnhancerOverride,
58
+ LabelContainer: LabelContainerOverride,
50
59
  Caption: CaptionOverride,
51
60
  ControlContainer: ControlContainerOverride,
52
61
  },
@@ -57,17 +66,22 @@ export default class FormControl extends React.Component<
57
66
  positive,
58
67
  htmlFor,
59
68
  children,
69
+ counter,
60
70
  } = this.props;
61
71
 
62
72
  const onlyChildProps = React.Children.only(children).props;
63
73
 
64
- const sharedProps = {
74
+ const sharedProps: StylePropsT = {
65
75
  $disabled: !!disabled,
66
76
  $error: !!error,
67
77
  $positive: !!positive,
68
78
  };
69
79
 
70
80
  const Label = getOverride(LabelOverride) || StyledLabel;
81
+ const LabelEndEnhancer =
82
+ getOverride(LabelEndEnhancerOverride) || StyledLabelEndEnhancer;
83
+ const LabelContainer =
84
+ getOverride(LabelContainerOverride) || StyledLabelContainer;
71
85
  const Caption = getOverride(CaptionOverride) || StyledCaption;
72
86
  const ControlContainer =
73
87
  getOverride(ControlContainerOverride) || StyledControlContainer;
@@ -83,17 +97,75 @@ export default class FormControl extends React.Component<
83
97
  }
84
98
  }
85
99
 
100
+ let labelEndEnhancer = this.props.labelEndEnhancer;
101
+ if (counter) {
102
+ // inferred values are preferred but if the user specifies the value
103
+ // that is then used as the default.
104
+ let maxLength: ?number = null;
105
+ let length: ?number = null;
106
+ let counterError: ?boolean = null;
107
+
108
+ if (typeof counter === 'object') {
109
+ length = counter.length;
110
+ maxLength = counter.maxLength;
111
+ counterError = counter.error;
112
+ }
113
+
114
+ maxLength = maxLength ? maxLength : onlyChildProps.maxLength;
115
+ if (length == null && typeof onlyChildProps.value === 'string') {
116
+ length = onlyChildProps.value.length;
117
+ }
118
+
119
+ if (length == null) {
120
+ length = 0;
121
+ if (__DEV__) {
122
+ console.warn(
123
+ `[FromControl] \`length\` must either be explicitly set via \`counter\` object property, or \`value\` string property on the child component.`,
124
+ );
125
+ }
126
+ }
127
+
128
+ sharedProps.$length = length;
129
+ if (maxLength == null) {
130
+ if (!labelEndEnhancer) labelEndEnhancer = `${length}`;
131
+ } else {
132
+ sharedProps.$maxLength = length;
133
+ if (!labelEndEnhancer) labelEndEnhancer = `${length}/${maxLength}`;
134
+ if (length > maxLength && counterError == null) counterError = true;
135
+ }
136
+
137
+ if (counterError) {
138
+ sharedProps.$error = true;
139
+ sharedProps.$counterError = true;
140
+ }
141
+ }
142
+
86
143
  return (
87
144
  <React.Fragment>
88
145
  {label && (
89
- <Label
90
- data-baseweb="form-control-label"
91
- htmlFor={htmlFor || onlyChildProps.id}
146
+ <LabelContainer
92
147
  {...sharedProps}
93
- {...getOverrideProps(LabelOverride)}
148
+ {...getOverrideProps(LabelContainerOverride)}
94
149
  >
95
- {typeof label === 'function' ? label(sharedProps) : label}
96
- </Label>
150
+ <Label
151
+ data-baseweb="form-control-label"
152
+ htmlFor={htmlFor || onlyChildProps.id}
153
+ {...sharedProps}
154
+ {...getOverrideProps(LabelOverride)}
155
+ >
156
+ {typeof label === 'function' ? label(sharedProps) : label}
157
+ </Label>
158
+ {labelEndEnhancer && (
159
+ <LabelEndEnhancer
160
+ {...sharedProps}
161
+ {...getOverrideProps(LabelEndEnhancerOverride)}
162
+ >
163
+ {typeof labelEndEnhancer === 'function'
164
+ ? labelEndEnhancer(sharedProps)
165
+ : labelEndEnhancer}
166
+ </LabelEndEnhancer>
167
+ )}
168
+ </LabelContainer>
97
169
  )}
98
170
  <UIDConsumer>
99
171
  {captionId => (
@@ -114,11 +186,11 @@ export default class FormControl extends React.Component<
114
186
  error:
115
187
  typeof onlyChildProps.error !== 'undefined'
116
188
  ? onlyChildProps.error
117
- : error,
189
+ : sharedProps.$error,
118
190
  positive:
119
191
  typeof onlyChildProps.positive !== 'undefined'
120
192
  ? onlyChildProps.positive
121
- : positive,
193
+ : sharedProps.$positive,
122
194
  });
123
195
  })}
124
196
  {(caption || error || positive) && (
@@ -25,6 +25,7 @@ export interface FormControlProps {
25
25
  error?: boolean | React.ReactNode;
26
26
  positive?: React.ReactNode;
27
27
  htmlFor?: string;
28
+ counter?: boolean | {length?: number; maxLength?: number; error?: boolean};
28
29
  }
29
30
 
30
31
  export class FormControl extends React.Component<
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ControlContainer = exports.Caption = exports.Label = void 0;
6
+ exports.ControlContainer = exports.Caption = exports.LabelEndEnhancer = exports.LabelContainer = exports.Label = void 0;
7
7
 
8
8
  var _index = require("../styles/index.js");
9
9
 
@@ -17,7 +17,6 @@ var Label = (0, _index.styled)('label', function (props) {
17
17
  var $disabled = props.$disabled,
18
18
  _props$$theme = props.$theme,
19
19
  colors = _props$$theme.colors,
20
- sizing = _props$$theme.sizing,
21
20
  typography = _props$$theme.typography;
22
21
  return _objectSpread(_objectSpread({}, typography.font250), {}, {
23
22
  fontWeight: 500,
@@ -27,15 +26,38 @@ var Label = (0, _index.styled)('label', function (props) {
27
26
  paddingTop: 0,
28
27
  paddingRight: 0,
29
28
  paddingBottom: 0,
30
- paddingLeft: 0,
29
+ paddingLeft: 0
30
+ });
31
+ });
32
+ exports.Label = Label;
33
+ Label.displayName = "Label";
34
+ var LabelContainer = (0, _index.styled)('span', function (_ref) {
35
+ var sizing = _ref.$theme.sizing;
36
+ return {
37
+ display: 'flex',
38
+ width: '100%',
31
39
  marginTop: sizing.scale300,
32
40
  marginRight: 0,
33
41
  marginBottom: sizing.scale300,
34
42
  marginLeft: 0
43
+ };
44
+ });
45
+ exports.LabelContainer = LabelContainer;
46
+ LabelContainer.displayName = "LabelContainer";
47
+ var LabelEndEnhancer = (0, _index.styled)('span', function (_ref2) {
48
+ var $disabled = _ref2.$disabled,
49
+ $counterError = _ref2.$counterError,
50
+ _ref2$$theme = _ref2.$theme,
51
+ colors = _ref2$$theme.colors,
52
+ typography = _ref2$$theme.typography;
53
+ return _objectSpread(_objectSpread({}, typography.font100), {}, {
54
+ flex: 0,
55
+ width: '100%',
56
+ color: $counterError ? colors.negative400 : $disabled ? colors.contentSecondary : colors.contentPrimary
35
57
  });
36
58
  });
37
- exports.Label = Label;
38
- Label.displayName = "Label";
59
+ exports.LabelEndEnhancer = LabelEndEnhancer;
60
+ LabelEndEnhancer.displayName = "LabelEndEnhancer";
39
61
  var Caption = (0, _index.styled)('div', function (props) {
40
62
  var $error = props.$error,
41
63
  $positive = props.$positive,
@@ -12,7 +12,7 @@ import type {StylePropsT} from './types.js';
12
12
  export const Label = styled<StylePropsT>('label', props => {
13
13
  const {
14
14
  $disabled,
15
- $theme: {colors, sizing, typography},
15
+ $theme: {colors, typography},
16
16
  } = props;
17
17
  return {
18
18
  ...typography.font250,
@@ -24,12 +24,34 @@ export const Label = styled<StylePropsT>('label', props => {
24
24
  paddingRight: 0,
25
25
  paddingBottom: 0,
26
26
  paddingLeft: 0,
27
+ };
28
+ });
29
+
30
+ export const LabelContainer = styled<StylePropsT>(
31
+ 'span',
32
+ ({$theme: {sizing}}) => ({
33
+ display: 'flex',
34
+ width: '100%',
27
35
  marginTop: sizing.scale300,
28
36
  marginRight: 0,
29
37
  marginBottom: sizing.scale300,
30
38
  marginLeft: 0,
31
- };
32
- });
39
+ }),
40
+ );
41
+
42
+ export const LabelEndEnhancer = styled<StylePropsT>(
43
+ 'span',
44
+ ({$disabled, $counterError, $theme: {colors, typography}}) => ({
45
+ ...typography.font100,
46
+ flex: 0,
47
+ width: '100%',
48
+ color: $counterError
49
+ ? colors.negative400
50
+ : $disabled
51
+ ? colors.contentSecondary
52
+ : colors.contentPrimary,
53
+ }),
54
+ );
33
55
 
34
56
  export const Caption = styled<StylePropsT>('div', props => {
35
57
  const {
@@ -13,15 +13,20 @@ export type FormControlStateT = {|
13
13
  captionId: string,
14
14
  |};
15
15
 
16
+ export type OverridesT = {
17
+ /** Customizes the label element. */
18
+ Label?: OverrideT,
19
+ /** Customizes the label end enhancer element. */
20
+ LabelEndEnhancer?: OverrideT,
21
+ /** Customizes the label container element. */
22
+ LabelContainer?: OverrideT,
23
+ /** Customizes the caption element. */
24
+ Caption?: OverrideT,
25
+ /** Customizes the container element. */
26
+ ControlContainer?: OverrideT,
27
+ };
16
28
  export type FormControlPropsT = {
17
- overrides: {
18
- /** Customizes the label element. */
19
- Label?: OverrideT,
20
- /** Customizes the caption element. */
21
- Caption?: OverrideT,
22
- /** Customizes the container element. */
23
- ControlContainer?: OverrideT,
24
- },
29
+ overrides: OverridesT,
25
30
  /** A label rendered above the input field. */
26
31
  label: ?(React.Node | ((props: {}) => React.Node)),
27
32
  /** A caption rendered below the input field. */
@@ -34,6 +39,10 @@ export type FormControlPropsT = {
34
39
  positive?: React.Node | ((props: {}) => React.Node),
35
40
  /** The id of the related form element. Defaults to the id property of the child, if any. */
36
41
  htmlFor?: string,
42
+ /** Adds a label end enhancer to the label */
43
+ labelEndEnhancer?: ?(React.Node | ((props: {}) => React.Node)),
44
+ /** Adds a length counter to the form control. If your input does not have a "string" value exposed as a prop, you provide the length as an object.*/
45
+ counter?: boolean | {|length?: number, maxLength?: number, error?: boolean|},
37
46
  children: React.Node,
38
47
  };
39
48
 
@@ -41,6 +50,9 @@ export type StylePropsT = {
41
50
  $disabled?: boolean,
42
51
  $error?: boolean,
43
52
  $positive?: boolean,
53
+ $length?: number,
54
+ $maxLength?: number,
55
+ $counterError?: boolean,
44
56
  };
45
57
 
46
58
  declare var __DEV__: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "baseui",
3
- "version": "10.9.0",
3
+ "version": "10.9.1",
4
4
  "description": "A React Component library implementing the Base design language",
5
5
  "keywords": [
6
6
  "react",
@@ -193,7 +193,6 @@
193
193
  "dependencies": {
194
194
  "@date-io/date-fns": "^2.6.2",
195
195
  "card-validator": "^6.2.0",
196
- "d3": "^7.3.0",
197
196
  "date-fns": "^2.6.0",
198
197
  "date-fns-tz": "^1.2.2",
199
198
  "glob": "^7.1.6",
@@ -535,7 +535,7 @@ var PopoverInner = /*#__PURE__*/function (_React$Component) {
535
535
  crossFrame: false,
536
536
  focusOptions: this.props.focusOptions
537
537
  }, this.renderPopover(renderedContent)) : /*#__PURE__*/React.createElement(_reactFocusLock.MoveFocusInside, {
538
- disabled: !this.props.autoFocus && !this.state.autoFocusAfterPositioning
538
+ disabled: !this.props.autoFocus || !this.state.autoFocusAfterPositioning
539
539
  }, this.renderPopover(renderedContent)))));
540
540
  } else {
541
541
  rendered.push( /*#__PURE__*/React.createElement(_styledComponents.Hidden, {
@@ -486,7 +486,7 @@ class PopoverInner extends React.Component<
486
486
  ) : (
487
487
  <MoveFocusInside
488
488
  disabled={
489
- !this.props.autoFocus &&
489
+ !this.props.autoFocus ||
490
490
  !this.state.autoFocusAfterPositioning
491
491
  }
492
492
  >