@pingux/astro 1.33.0 → 1.33.1-alpha.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.
@@ -20,7 +20,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/e
20
20
 
21
21
  var _react = _interopRequireWildcard(require("react"));
22
22
 
23
- var _themeUi = require("theme-ui");
23
+ var _CheckboxBase = _interopRequireDefault(require("./CheckboxBase"));
24
24
 
25
25
  var _react2 = require("@emotion/react");
26
26
 
@@ -35,12 +35,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
35
35
  * **Note: Requires a label. It's recommended to use `CheckboxField` for a complete solution.**
36
36
  */
37
37
  var Checkbox = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
38
- return (0, _react2.jsx)(_themeUi.Checkbox, (0, _extends2["default"])({
39
- ref: ref,
40
- __css: {
41
- top: 0,
42
- left: 0
43
- }
38
+ return (0, _react2.jsx)(_CheckboxBase["default"], (0, _extends2["default"])({
39
+ ref: ref
44
40
  }, props));
45
41
  });
46
42
  Checkbox.displayName = 'Checkbox';
@@ -32,5 +32,7 @@ test('default checkbox', function () {
32
32
  var input = _react2.screen.getByRole('checkbox');
33
33
 
34
34
  expect(input).toBeInstanceOf(HTMLInputElement);
35
- expect(input).toBeInTheDocument();
35
+ expect(input).toBeInTheDocument(); // Should be visually hidden
36
+
37
+ expect(input).not.toBeVisible();
36
38
  });
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
6
+
7
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
8
+
9
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
10
+
11
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
12
+
13
+ _Object$defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+
17
+ exports["default"] = void 0;
18
+
19
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
20
+
21
+ var _react = _interopRequireWildcard(require("react"));
22
+
23
+ var _themeUi = require("theme-ui");
24
+
25
+ var _visuallyHidden = require("@react-aria/visually-hidden");
26
+
27
+ var _Box = _interopRequireDefault(require("../Box"));
28
+
29
+ var _react2 = require("@emotion/react");
30
+
31
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
32
+
33
+ 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; }
34
+
35
+ /**
36
+ * Checkbox component from Theme UI, renders a visually hidden input + svg icons for the
37
+ * checked and unchecked states.
38
+ */
39
+ var DefaultCheckbox = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
40
+ return (0, _react2.jsx)(_themeUi.Checkbox, (0, _extends2["default"])({
41
+ ref: ref,
42
+ __css: {
43
+ top: 0,
44
+ left: 0
45
+ }
46
+ }, props));
47
+ });
48
+
49
+ var IndeterminateCheckboxIcon = function IndeterminateCheckboxIcon(props) {
50
+ return (0, _react2.jsx)("svg", (0, _extends2["default"])({
51
+ width: "24",
52
+ height: "24",
53
+ viewBox: "0 0 24 24",
54
+ fill: "none",
55
+ xmlns: "http://www.w3.org/2000/svg"
56
+ }, props), (0, _react2.jsx)("rect", {
57
+ x: "3.5",
58
+ y: "3.5",
59
+ width: "17",
60
+ height: "17",
61
+ rx: "1.5",
62
+ fill: "#4462ED",
63
+ stroke: "#4462ED"
64
+ }), (0, _react2.jsx)("rect", {
65
+ x: "6.5",
66
+ y: "11",
67
+ width: "11",
68
+ height: "2",
69
+ fill: "white"
70
+ }));
71
+ };
72
+ /**
73
+ * Renders a visually hidden default checkbox since the Theme UI checkbox does not support
74
+ * indeterminism. This allows us to have the necessary ARIA attributes and visual presentation.
75
+ */
76
+
77
+
78
+ var IndeterminateCheckbox = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
79
+ /* eslint-disable no-param-reassign */
80
+ if (ref !== null && ref !== void 0 && ref.current) ref.current.indeterminate = true;
81
+ return (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_visuallyHidden.VisuallyHidden, null, (0, _react2.jsx)(DefaultCheckbox, (0, _extends2["default"])({
82
+ ref: ref
83
+ }, props))), (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
84
+ as: IndeterminateCheckboxIcon,
85
+ mr: 2
86
+ }, props)));
87
+ });
88
+ var CheckboxBase = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
89
+ /* eslint-disable react/prop-types */
90
+ return props.isIndeterminate ? (0, _react2.jsx)(IndeterminateCheckbox, (0, _extends2["default"])({
91
+ ref: ref
92
+ }, props)) : (0, _react2.jsx)(DefaultCheckbox, (0, _extends2["default"])({
93
+ ref: ref
94
+ }, props));
95
+ });
96
+ var _default = CheckboxBase;
97
+ exports["default"] = _default;
@@ -73,6 +73,7 @@ var CheckboxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
73
73
  hasAutoFocus = props.hasAutoFocus,
74
74
  helperText = props.helperText,
75
75
  isDefaultSelected = props.isDefaultSelected,
76
+ isIndeterminate = props.isIndeterminate,
76
77
  status = props.status;
77
78
 
78
79
  var checkboxProps = _objectSpread(_objectSpread({
@@ -89,11 +90,21 @@ var CheckboxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
89
90
  (0, _react.useImperativeHandle)(ref, function () {
90
91
  return checkboxRef.current;
91
92
  });
93
+ (0, _react.useEffect)(function () {
94
+ if (checkboxRef.current && isIndeterminate) {
95
+ checkboxRef.current.indeterminate = true;
96
+ } else if (checkboxRef.current && !isIndeterminate) {
97
+ checkboxRef.current.indeterminate = false;
98
+ }
99
+ }, [isIndeterminate]);
92
100
 
93
101
  var _useCheckbox = (0, _checkbox.useCheckbox)(checkboxProps, state, checkboxRef),
94
102
  inputProps = _useCheckbox.inputProps;
95
103
 
96
104
  var _useField = (0, _hooks.useField)(_objectSpread(_objectSpread({}, props), {}, {
105
+ statusClasses: {
106
+ isIndeterminate: isIndeterminate
107
+ },
97
108
  controlProps: _objectSpread(_objectSpread({}, controlProps), inputProps)
98
109
  })),
99
110
  fieldContainerProps = _useField.fieldContainerProps,
@@ -131,8 +142,8 @@ CheckboxField.propTypes = _objectSpread({
131
142
  isDisabled: _propTypes["default"].bool,
132
143
 
133
144
  /**
134
- * Indeterminism is presentational only. The indeterminate visual representation remains
135
- * regardless of user interaction.
145
+ * Indeterminism is presentational only. The indeterminate visual representation remains until
146
+ * this prop is set to false regardless of user interaction.
136
147
  */
137
148
  isIndeterminate: _propTypes["default"].bool,
138
149
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
6
+
7
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
8
+
5
9
  var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
10
 
7
11
  var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
@@ -22,13 +26,19 @@ _Object$defineProperty(exports, "__esModule", {
22
26
  value: true
23
27
  });
24
28
 
25
- exports["default"] = exports.Required = exports.HelperText = exports.DefaultSelected = exports.Default = exports.Controlled = void 0;
29
+ exports["default"] = exports.Required = exports.Indeterminate = exports.HelperText = exports.DefaultSelected = exports.Default = exports.Controlled = void 0;
30
+
31
+ var _every = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/every"));
32
+
33
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
26
34
 
27
35
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
28
36
 
37
+ var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));
38
+
29
39
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
30
40
 
31
- var _react = _interopRequireDefault(require("react"));
41
+ var _react = _interopRequireWildcard(require("react"));
32
42
 
33
43
  var _ariaAttributes = require("../../utils/devUtils/props/ariaAttributes");
34
44
 
@@ -40,8 +50,14 @@ var _Text = _interopRequireDefault(require("../Text"));
40
50
 
41
51
  var _statuses = _interopRequireDefault(require("../../utils/devUtils/constants/statuses"));
42
52
 
53
+ var _Box = _interopRequireDefault(require("../Box"));
54
+
43
55
  var _react2 = require("@emotion/react");
44
56
 
57
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
58
+
59
+ 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; }
60
+
45
61
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
46
62
 
47
63
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -69,7 +85,7 @@ var _default = {
69
85
  status: {
70
86
  control: {
71
87
  type: 'select',
72
- options: _statuses["default"]
88
+ options: (0, _values["default"])(_statuses["default"])
73
89
  },
74
90
  defaultValue: _statuses["default"].DEFAULT
75
91
  },
@@ -156,4 +172,98 @@ var HelperText = function HelperText() {
156
172
  });
157
173
  };
158
174
 
159
- exports.HelperText = HelperText;
175
+ exports.HelperText = HelperText;
176
+
177
+ var Indeterminate = function Indeterminate() {
178
+ // Whether the parent checkbox is indeterminate (default is true for our example)
179
+ var _useState = (0, _react.useState)(true),
180
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
181
+ isIndeterminate = _useState2[0],
182
+ setIsIndeterminate = _useState2[1]; // Whether the parent checkbox should be checked, this is set independently from indeterminism
183
+
184
+
185
+ var _useState3 = (0, _react.useState)(false),
186
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
187
+ isCompleted = _useState4[0],
188
+ setIsCompleted = _useState4[1]; // The state of the sub-checkboxes
189
+
190
+
191
+ var _useState5 = (0, _react.useState)([{
192
+ label: 'Apple Chunks',
193
+ isSelected: true
194
+ }, {
195
+ label: 'Blueberries',
196
+ isSelected: false
197
+ }, {
198
+ label: 'Grapes',
199
+ isSelected: false
200
+ }, {
201
+ label: 'Strawberry Slices',
202
+ isSelected: true
203
+ }]),
204
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
205
+ subCheckboxes = _useState6[0],
206
+ setSubCheckboxes = _useState6[1]; // Determine which checkbox needs its state updated
207
+
208
+
209
+ var handleSubCheckboxChange = function handleSubCheckboxChange(isSelected, changedIndex) {
210
+ var changeAll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
211
+ var newSubCheckboxes = (0, _map["default"])(subCheckboxes).call(subCheckboxes, function (checkbox, index) {
212
+ if (changeAll || index === changedIndex) return _objectSpread(_objectSpread({}, checkbox), {}, {
213
+ isSelected: isSelected
214
+ });
215
+ return checkbox;
216
+ });
217
+ setSubCheckboxes(newSubCheckboxes);
218
+ }; // Update all sub-checkbox states when the parent checkbox is pressed
219
+
220
+
221
+ var handleParentCheckboxChange = function handleParentCheckboxChange(isSelected) {
222
+ handleSubCheckboxChange(isSelected, null, true);
223
+ };
224
+
225
+ (0, _react.useEffect)(function () {
226
+ // Determine if all sub-checkboxes are selected / unselected or if there is a mix
227
+ // and update the parent checkbox
228
+ if ((0, _every["default"])(subCheckboxes).call(subCheckboxes, function (item) {
229
+ return item.isSelected;
230
+ })) {
231
+ setIsIndeterminate(false);
232
+ setIsCompleted(true);
233
+ } else if ((0, _every["default"])(subCheckboxes).call(subCheckboxes, function (item) {
234
+ return !item.isSelected;
235
+ })) {
236
+ setIsIndeterminate(false);
237
+ setIsCompleted(false);
238
+ } else {
239
+ setIsIndeterminate(true);
240
+ setIsCompleted(false);
241
+ }
242
+ }, [isIndeterminate, subCheckboxes]);
243
+ return (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_CheckboxField["default"], {
244
+ label: "Fruit Salad Recipe",
245
+ isIndeterminate: isIndeterminate,
246
+ isSelected: isCompleted,
247
+ onChange: handleParentCheckboxChange
248
+ }), (0, _react2.jsx)(_Box["default"], {
249
+ ml: "lg"
250
+ }, (0, _map["default"])(subCheckboxes).call(subCheckboxes, function (checkbox, index) {
251
+ return (0, _react2.jsx)(_CheckboxField["default"], {
252
+ key: checkbox.label,
253
+ label: checkbox.label,
254
+ isSelected: checkbox.isSelected,
255
+ onChange: function onChange(isSelected) {
256
+ return handleSubCheckboxChange(isSelected, index);
257
+ }
258
+ });
259
+ })));
260
+ };
261
+
262
+ exports.Indeterminate = Indeterminate;
263
+ Indeterminate.parameters = {
264
+ docs: {
265
+ description: {
266
+ story: 'When a `CheckboxField` is indeterminate, it\'s necessary to control the state in order to determine how it should function when pressed. Here is an example of how to do that.'
267
+ }
268
+ }
269
+ };
@@ -23,7 +23,12 @@ var defaultProps = {
23
23
 
24
24
  var getComponent = function getComponent() {
25
25
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
- return (0, _testWrapper.render)((0, _react2.jsx)(_CheckboxField["default"], (0, _extends2["default"])({}, defaultProps, props)));
26
+
27
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
28
+ _ref$renderFn = _ref.renderFn,
29
+ renderFn = _ref$renderFn === void 0 ? _testWrapper.render : _ref$renderFn;
30
+
31
+ return renderFn((0, _react2.jsx)(_CheckboxField["default"], (0, _extends2["default"])({}, defaultProps, props)));
27
32
  }; // Need to be added to each test file to test accessibility using axe.
28
33
 
29
34
 
@@ -113,4 +118,37 @@ test('read only checkbox', function () {
113
118
  var input = _testWrapper.screen.getByRole('checkbox');
114
119
 
115
120
  expect(input).toHaveAttribute('readonly');
121
+ });
122
+ test('indeterminate checkbox', function () {
123
+ var _getComponent = getComponent({
124
+ isIndeterminate: true
125
+ }),
126
+ rerender = _getComponent.rerender;
127
+
128
+ var input = _testWrapper.screen.getByRole('checkbox');
129
+
130
+ var label = _testWrapper.screen.getByText(testLabel);
131
+ /* eslint-disable jest-dom/prefer-checked */
132
+
133
+
134
+ expect(input).toHaveAttribute('aria-checked', 'mixed');
135
+ expect(label).toHaveClass('is-indeterminate'); // Ensure it cannot be changed via user interaction
136
+
137
+ _userEvent["default"].click(input);
138
+
139
+ expect(input).toHaveAttribute('aria-checked', 'mixed'); // An indeterminite checkbox can still have the checked attribute
140
+
141
+ expect(input).toBeChecked(); // Ensure it works normally when toggled off again
142
+
143
+ getComponent({}, {
144
+ renderFn: rerender
145
+ }); // Reset the variable since the DOM has changed
146
+
147
+ input = _testWrapper.screen.getByRole('checkbox');
148
+ expect(input).not.toHaveAttribute('aria-checked', 'mixed');
149
+ expect(label).not.toHaveClass('is-indeterminate'); // Ensure it can be changed via user interaction, should be unchecked now
150
+
151
+ _userEvent["default"].click(input);
152
+
153
+ expect(input).not.toBeChecked();
116
154
  });
@@ -126,7 +126,12 @@ var Modal = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
126
126
 
127
127
  var _useDialog = (0, _dialog.useDialog)(contentProps, modalRef),
128
128
  dialogProps = _useDialog.dialogProps,
129
- titleProps = _useDialog.titleProps;
129
+ titleProps = _useDialog.titleProps; // Prevents extra dialog focus from being called.
130
+
131
+
132
+ dialogProps.onMouseDown = function (e) {
133
+ return e.preventDefault();
134
+ };
130
135
 
131
136
  var _useStatusClasses = (0, _hooks.useStatusClasses)(className, {
132
137
  isDarkMode: others.variant === 'modal.dark'
@@ -18,6 +18,13 @@ var _react2 = require("@emotion/react");
18
18
  var getComponent = function getComponent() {
19
19
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20
20
  return (0, _testWrapper.render)((0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Modal, props)));
21
+ };
22
+
23
+ var getComponentWithCheckbox = function getComponentWithCheckbox() {
24
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
25
+ return (0, _testWrapper.render)((0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Modal, props, (0, _react2.jsx)(_index.CheckboxField, {
26
+ "aria-label": "checkbox"
27
+ }))));
21
28
  }; // **********
22
29
  // Unit tests
23
30
  // **********
@@ -219,4 +226,21 @@ test('should auto focus the first tabbable element if "hasAutoFocus" is true', f
219
226
  var button = _testWrapper.screen.queryByRole('button');
220
227
 
221
228
  expect(button).toHaveFocus();
229
+ });
230
+ test('checkbox should not have focus outline on click', function () {
231
+ getComponentWithCheckbox({
232
+ isOpen: true
233
+ });
234
+
235
+ var checkbox = _testWrapper.screen.getByRole('checkbox');
236
+
237
+ _userEvent["default"].click(checkbox);
238
+
239
+ expect(checkbox).toBeChecked();
240
+ expect(checkbox).not.toHaveClass('is-focused');
241
+
242
+ _userEvent["default"].click(checkbox);
243
+
244
+ expect(checkbox).not.toBeChecked();
245
+ expect(checkbox).not.toHaveClass('is-focused');
222
246
  });
@@ -52,7 +52,7 @@ var _hooks = require("../../hooks");
52
52
 
53
53
  var _constants = require("../../components/Label/constants");
54
54
 
55
- var _excluded = ["autocomplete", "autoComplete", "autoCorrect", "children", "className", "containerProps", "controlProps", "defaultText", "defaultValue", "direction", "disabledKeys", "hasAutoFocus", "hasNoStatusIndicator", "helperText", "hintText", "id", "isDefaultSelected", "isDisabled", "isReadOnly", "isRequired", "isSelected", "label", "labelMode", "labelProps", "maxLength", "name", "onBlur", "onChange", "onClear", "onFocus", "onFocusChange", "onLoadMore", "onOpenChange", "onSelectionChange", "placeholder", "role", "selectedKey", "spellCheck", "status", "statusClasses", "type", "value"];
55
+ var _excluded = ["autocomplete", "autoComplete", "autoCorrect", "children", "className", "containerProps", "controlProps", "defaultText", "defaultValue", "direction", "disabledKeys", "hasAutoFocus", "hasNoStatusIndicator", "helperText", "hintText", "id", "isDefaultSelected", "isDisabled", "isIndeterminate", "isReadOnly", "isRequired", "isSelected", "label", "labelMode", "labelProps", "maxLength", "name", "onBlur", "onChange", "onClear", "onFocus", "onFocusChange", "onLoadMore", "onOpenChange", "onSelectionChange", "placeholder", "role", "selectedKey", "spellCheck", "status", "statusClasses", "type", "value"];
56
56
 
57
57
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
58
58
 
@@ -85,6 +85,7 @@ var useField = function useField() {
85
85
  id = props.id,
86
86
  isDefaultSelected = props.isDefaultSelected,
87
87
  isDisabled = props.isDisabled,
88
+ isIndeterminate = props.isIndeterminate,
88
89
  isReadOnly = props.isReadOnly,
89
90
  isRequired = props.isRequired,
90
91
  isSelected = props.isSelected,
@@ -210,6 +211,7 @@ var useField = function useField() {
210
211
  disabled: isDisabled,
211
212
  id: id,
212
213
  isFocused: hasFocusWithin,
214
+ isIndeterminate: isIndeterminate,
213
215
  maxLength: maxLength,
214
216
  name: name,
215
217
  onChange: fieldOnChange,
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
2
  import React, { forwardRef } from 'react';
3
- import { Checkbox as ThemeUICheckbox } from 'theme-ui';
3
+ import CheckboxBase from './CheckboxBase';
4
4
  /**
5
5
  * Basic checkbox input.
6
6
  * Built on top of the [Checkbox from Theme-UI](https://theme-ui.com/components/checkbox/).
@@ -10,12 +10,8 @@ import { Checkbox as ThemeUICheckbox } from 'theme-ui';
10
10
 
11
11
  import { jsx as ___EmotionJSX } from "@emotion/react";
12
12
  var Checkbox = /*#__PURE__*/forwardRef(function (props, ref) {
13
- return ___EmotionJSX(ThemeUICheckbox, _extends({
14
- ref: ref,
15
- __css: {
16
- top: 0,
17
- left: 0
18
- }
13
+ return ___EmotionJSX(CheckboxBase, _extends({
14
+ ref: ref
19
15
  }, props));
20
16
  });
21
17
  Checkbox.displayName = 'Checkbox';
@@ -22,5 +22,7 @@ test('default checkbox', function () {
22
22
  getComponent();
23
23
  var input = screen.getByRole('checkbox');
24
24
  expect(input).toBeInstanceOf(HTMLInputElement);
25
- expect(input).toBeInTheDocument();
25
+ expect(input).toBeInTheDocument(); // Should be visually hidden
26
+
27
+ expect(input).not.toBeVisible();
26
28
  });
@@ -0,0 +1,69 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import React, { forwardRef } from 'react';
3
+ import { Checkbox as ThemeUICheckbox } from 'theme-ui';
4
+ import { VisuallyHidden } from '@react-aria/visually-hidden';
5
+ import Box from '../Box';
6
+ /**
7
+ * Checkbox component from Theme UI, renders a visually hidden input + svg icons for the
8
+ * checked and unchecked states.
9
+ */
10
+
11
+ import { jsx as ___EmotionJSX } from "@emotion/react";
12
+ var DefaultCheckbox = /*#__PURE__*/forwardRef(function (props, ref) {
13
+ return ___EmotionJSX(ThemeUICheckbox, _extends({
14
+ ref: ref,
15
+ __css: {
16
+ top: 0,
17
+ left: 0
18
+ }
19
+ }, props));
20
+ });
21
+
22
+ var IndeterminateCheckboxIcon = function IndeterminateCheckboxIcon(props) {
23
+ return ___EmotionJSX("svg", _extends({
24
+ width: "24",
25
+ height: "24",
26
+ viewBox: "0 0 24 24",
27
+ fill: "none",
28
+ xmlns: "http://www.w3.org/2000/svg"
29
+ }, props), ___EmotionJSX("rect", {
30
+ x: "3.5",
31
+ y: "3.5",
32
+ width: "17",
33
+ height: "17",
34
+ rx: "1.5",
35
+ fill: "#4462ED",
36
+ stroke: "#4462ED"
37
+ }), ___EmotionJSX("rect", {
38
+ x: "6.5",
39
+ y: "11",
40
+ width: "11",
41
+ height: "2",
42
+ fill: "white"
43
+ }));
44
+ };
45
+ /**
46
+ * Renders a visually hidden default checkbox since the Theme UI checkbox does not support
47
+ * indeterminism. This allows us to have the necessary ARIA attributes and visual presentation.
48
+ */
49
+
50
+
51
+ var IndeterminateCheckbox = /*#__PURE__*/forwardRef(function (props, ref) {
52
+ /* eslint-disable no-param-reassign */
53
+ if (ref !== null && ref !== void 0 && ref.current) ref.current.indeterminate = true;
54
+ return ___EmotionJSX(React.Fragment, null, ___EmotionJSX(VisuallyHidden, null, ___EmotionJSX(DefaultCheckbox, _extends({
55
+ ref: ref
56
+ }, props))), ___EmotionJSX(Box, _extends({
57
+ as: IndeterminateCheckboxIcon,
58
+ mr: 2
59
+ }, props)));
60
+ });
61
+ var CheckboxBase = /*#__PURE__*/forwardRef(function (props, ref) {
62
+ /* eslint-disable react/prop-types */
63
+ return props.isIndeterminate ? ___EmotionJSX(IndeterminateCheckbox, _extends({
64
+ ref: ref
65
+ }, props)) : ___EmotionJSX(DefaultCheckbox, _extends({
66
+ ref: ref
67
+ }, props));
68
+ });
69
+ export default CheckboxBase;
@@ -14,7 +14,7 @@ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (
14
14
 
15
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
16
16
 
17
- import React, { forwardRef, useRef, useImperativeHandle } from 'react';
17
+ import React, { forwardRef, useRef, useImperativeHandle, useEffect } from 'react';
18
18
  import { useCheckbox } from '@react-aria/checkbox';
19
19
  import { useToggleState } from '@react-stately/toggle';
20
20
  import PropTypes from 'prop-types';
@@ -37,6 +37,7 @@ var CheckboxField = /*#__PURE__*/forwardRef(function (props, ref) {
37
37
  hasAutoFocus = props.hasAutoFocus,
38
38
  helperText = props.helperText,
39
39
  isDefaultSelected = props.isDefaultSelected,
40
+ isIndeterminate = props.isIndeterminate,
40
41
  status = props.status;
41
42
 
42
43
  var checkboxProps = _objectSpread(_objectSpread({
@@ -53,11 +54,21 @@ var CheckboxField = /*#__PURE__*/forwardRef(function (props, ref) {
53
54
  useImperativeHandle(ref, function () {
54
55
  return checkboxRef.current;
55
56
  });
57
+ useEffect(function () {
58
+ if (checkboxRef.current && isIndeterminate) {
59
+ checkboxRef.current.indeterminate = true;
60
+ } else if (checkboxRef.current && !isIndeterminate) {
61
+ checkboxRef.current.indeterminate = false;
62
+ }
63
+ }, [isIndeterminate]);
56
64
 
57
65
  var _useCheckbox = useCheckbox(checkboxProps, state, checkboxRef),
58
66
  inputProps = _useCheckbox.inputProps;
59
67
 
60
68
  var _useField = useField(_objectSpread(_objectSpread({}, props), {}, {
69
+ statusClasses: {
70
+ isIndeterminate: isIndeterminate
71
+ },
61
72
  controlProps: _objectSpread(_objectSpread({}, controlProps), inputProps)
62
73
  })),
63
74
  fieldContainerProps = _useField.fieldContainerProps,
@@ -95,8 +106,8 @@ CheckboxField.propTypes = _objectSpread({
95
106
  isDisabled: PropTypes.bool,
96
107
 
97
108
  /**
98
- * Indeterminism is presentational only. The indeterminate visual representation remains
99
- * regardless of user interaction.
109
+ * Indeterminism is presentational only. The indeterminate visual representation remains until
110
+ * this prop is set to false regardless of user interaction.
100
111
  */
101
112
  isIndeterminate: PropTypes.bool,
102
113