@primer/components 32.0.2-rc.859381a1 → 32.1.1-rc.b4502a34

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 (155) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/browser.esm.js +9 -2
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +9 -2
  5. package/dist/browser.umd.js.map +1 -1
  6. package/docs/content/ActionList2.mdx +23 -3
  7. package/docs/content/Avatar.mdx +21 -1
  8. package/docs/content/AvatarStack.mdx +23 -3
  9. package/docs/content/BranchName.md +24 -4
  10. package/docs/content/Breadcrumbs.md +22 -1
  11. package/docs/content/Buttons.md +2 -1
  12. package/docs/content/Checkbox.md +118 -0
  13. package/docs/content/CircleBadge.md +1 -0
  14. package/docs/content/CircleOcticon.md +2 -1
  15. package/docs/content/CounterLabel.md +1 -1
  16. package/docs/content/Details.md +2 -1
  17. package/docs/content/Dialog.md +1 -0
  18. package/docs/content/Dialog2.mdx +1 -0
  19. package/docs/content/Dropdown.md +1 -0
  20. package/docs/content/DropdownMenu.mdx +1 -0
  21. package/docs/content/FilterList.md +1 -0
  22. package/docs/content/FilteredSearch.md +1 -0
  23. package/docs/content/Flash.md +1 -0
  24. package/docs/content/FormGroup.md +1 -0
  25. package/docs/content/Header.md +1 -0
  26. package/docs/content/Heading.md +8 -4
  27. package/docs/content/Label.md +1 -0
  28. package/docs/content/LabelGroup.md +1 -0
  29. package/docs/content/Link.md +1 -0
  30. package/docs/content/Overlay.mdx +1 -0
  31. package/docs/content/Pagehead.md +1 -0
  32. package/docs/content/Pagination.md +1 -0
  33. package/docs/content/PointerBox.md +1 -0
  34. package/docs/content/Popover.md +1 -0
  35. package/docs/content/Portal.mdx +1 -0
  36. package/docs/content/Position.md +2 -9
  37. package/docs/content/ProgressBar.mdx +1 -0
  38. package/docs/content/SelectMenu.md +1 -0
  39. package/docs/content/SideNav.md +1 -0
  40. package/docs/content/StateLabel.md +1 -0
  41. package/docs/content/StyledOcticon.md +1 -1
  42. package/docs/content/SubNav.md +1 -0
  43. package/docs/content/TabNav.md +1 -0
  44. package/docs/content/Text.md +10 -3
  45. package/docs/content/TextInput.md +9 -1
  46. package/docs/content/Timeline.md +1 -0
  47. package/docs/content/Tooltip.md +1 -0
  48. package/docs/content/Truncate.md +1 -0
  49. package/docs/content/UnderlineNav.md +1 -0
  50. package/docs/content/status.mdx +10 -0
  51. package/docs/src/@primer/gatsby-theme-doctocat/mdx-components.js +9 -0
  52. package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +4 -0
  53. package/docs/src/component-statuses.js +74 -0
  54. package/lib/ActionList/Item.js +3 -3
  55. package/lib/ActionList2/Item.js +3 -1
  56. package/lib/ActionList2/List.js +1 -2
  57. package/lib/ActionList2/Selection.js +3 -1
  58. package/lib/Autocomplete/Autocomplete.d.ts +1 -0
  59. package/lib/Autocomplete/AutocompleteInput.d.ts +1 -0
  60. package/lib/Button/Button.d.ts +1 -0
  61. package/lib/Button/ButtonClose.d.ts +2 -1
  62. package/lib/Button/ButtonDanger.d.ts +1 -0
  63. package/lib/Button/ButtonInvisible.d.ts +1 -0
  64. package/lib/Button/ButtonOutline.d.ts +1 -0
  65. package/lib/Button/ButtonPrimary.d.ts +1 -0
  66. package/lib/Checkbox.d.ts +29 -0
  67. package/lib/Checkbox.js +64 -0
  68. package/lib/CircleOcticon.d.ts +1 -0
  69. package/lib/Dialog.d.ts +3 -2
  70. package/lib/Dropdown.d.ts +4 -0
  71. package/lib/DropdownMenu/DropdownButton.d.ts +2 -1
  72. package/lib/FilterList.d.ts +1 -0
  73. package/lib/Position.d.ts +4 -4
  74. package/lib/SelectMenu/SelectMenu.d.ts +10 -4
  75. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  76. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  77. package/lib/TextInputWithTokens.d.ts +1 -0
  78. package/lib/Token/AvatarToken.d.ts +1 -1
  79. package/lib/Token/IssueLabelToken.d.ts +1 -1
  80. package/lib/Token/Token.d.ts +1 -1
  81. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  82. package/lib/__tests__/ActionList2.test.js +117 -0
  83. package/lib/__tests__/Checkbox.test.d.ts +2 -0
  84. package/lib/__tests__/Checkbox.test.js +189 -0
  85. package/lib/__tests__/themePreval.test.d.ts +1 -0
  86. package/lib/__tests__/themePreval.test.js +14 -0
  87. package/lib/index.d.ts +2 -0
  88. package/lib/index.js +8 -0
  89. package/lib/stories/ActionList2.stories.js +20 -6
  90. package/lib/stories/Checkbox.stories.js +227 -0
  91. package/lib/utils/testing.d.ts +1 -0
  92. package/lib/utils/testing.js +29 -0
  93. package/lib-esm/ActionList/Item.js +3 -3
  94. package/lib-esm/ActionList2/Item.js +3 -1
  95. package/lib-esm/ActionList2/List.js +1 -2
  96. package/lib-esm/ActionList2/Selection.js +3 -1
  97. package/lib-esm/Autocomplete/Autocomplete.d.ts +1 -0
  98. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +1 -0
  99. package/lib-esm/Button/Button.d.ts +1 -0
  100. package/lib-esm/Button/ButtonClose.d.ts +2 -1
  101. package/lib-esm/Button/ButtonDanger.d.ts +1 -0
  102. package/lib-esm/Button/ButtonInvisible.d.ts +1 -0
  103. package/lib-esm/Button/ButtonOutline.d.ts +1 -0
  104. package/lib-esm/Button/ButtonPrimary.d.ts +1 -0
  105. package/lib-esm/Checkbox.d.ts +29 -0
  106. package/lib-esm/Checkbox.js +44 -0
  107. package/lib-esm/CircleOcticon.d.ts +1 -0
  108. package/lib-esm/Dialog.d.ts +3 -2
  109. package/lib-esm/Dropdown.d.ts +4 -0
  110. package/lib-esm/DropdownMenu/DropdownButton.d.ts +2 -1
  111. package/lib-esm/FilterList.d.ts +1 -0
  112. package/lib-esm/Position.d.ts +4 -4
  113. package/lib-esm/SelectMenu/SelectMenu.d.ts +10 -4
  114. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  115. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  116. package/lib-esm/TextInputWithTokens.d.ts +1 -0
  117. package/lib-esm/Token/AvatarToken.d.ts +1 -1
  118. package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
  119. package/lib-esm/Token/Token.d.ts +1 -1
  120. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  121. package/lib-esm/__tests__/ActionList2.test.js +105 -2
  122. package/lib-esm/__tests__/Checkbox.test.d.ts +2 -0
  123. package/lib-esm/__tests__/Checkbox.test.js +169 -0
  124. package/lib-esm/__tests__/themePreval.test.d.ts +1 -0
  125. package/lib-esm/__tests__/themePreval.test.js +7 -0
  126. package/lib-esm/index.d.ts +2 -0
  127. package/lib-esm/index.js +1 -0
  128. package/lib-esm/stories/ActionList2.stories.js +20 -6
  129. package/lib-esm/stories/Checkbox.stories.js +197 -0
  130. package/lib-esm/utils/testing.d.ts +1 -0
  131. package/lib-esm/utils/testing.js +24 -0
  132. package/package-lock.json +179 -20
  133. package/package.json +2 -2
  134. package/src/ActionList/Item.tsx +2 -1
  135. package/src/ActionList2/Item.tsx +3 -2
  136. package/src/ActionList2/List.tsx +1 -6
  137. package/src/ActionList2/Selection.tsx +2 -1
  138. package/src/Checkbox.tsx +75 -0
  139. package/src/__tests__/ActionList2.test.tsx +111 -2
  140. package/src/__tests__/Checkbox.test.tsx +155 -0
  141. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +13 -0
  142. package/src/__tests__/__snapshots__/Checkbox.test.tsx.snap +16 -0
  143. package/src/__tests__/__snapshots__/themePreval.test.ts.snap +3176 -0
  144. package/src/__tests__/themePreval.test.ts +8 -0
  145. package/src/index.ts +3 -0
  146. package/src/stories/ActionList2.stories.tsx +22 -8
  147. package/src/stories/Checkbox.stories.tsx +164 -0
  148. package/src/utils/testing.tsx +22 -0
  149. package/stats.html +1 -1
  150. package/docs/content/TextInputTokens.mdx +0 -89
  151. package/lib/ActionList2/Header.d.ts +0 -26
  152. package/lib/ActionList2/Header.js +0 -55
  153. package/lib-esm/ActionList2/Header.d.ts +0 -26
  154. package/lib-esm/ActionList2/Header.js +0 -44
  155. package/src/ActionList2/Header.tsx +0 -58
@@ -0,0 +1,197 @@
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); }
2
+
3
+ import React, { useLayoutEffect, useRef, useState } from 'react';
4
+ import styled from 'styled-components';
5
+ import { BaseStyles, Box, Checkbox, Text, ThemeProvider } from '..';
6
+ import { action } from '@storybook/addon-actions';
7
+ import { COMMON, get } from '../constants';
8
+ export default {
9
+ title: 'Forms/Checkbox',
10
+ component: Checkbox,
11
+ decorators: [Story => {
12
+ return /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(BaseStyles, null, /*#__PURE__*/React.createElement(Box, {
13
+ paddingTop: 5
14
+ }, Story())));
15
+ }],
16
+ argTypes: {
17
+ sx: {
18
+ table: {
19
+ disable: true
20
+ }
21
+ },
22
+ disabled: {
23
+ name: 'Disabled',
24
+ defaultValue: false,
25
+ control: {
26
+ type: 'boolean'
27
+ }
28
+ }
29
+ }
30
+ };
31
+ const StyledLabel = styled.label.withConfig({
32
+ displayName: "Checkboxstories__StyledLabel",
33
+ componentId: "sdupvr-0"
34
+ })(["user-select:none;font-weight:600;font-size:14px;line-height:18px;margin-left:16px;", ""], COMMON);
35
+ const StyledSubLabel = styled(Text).withConfig({
36
+ displayName: "Checkboxstories__StyledSubLabel",
37
+ componentId: "sdupvr-1"
38
+ })(["color:", ";font-size:13px;", ""], get('colors.fg.muted'), COMMON);
39
+ export const Default = args => {
40
+ const [isChecked, setChecked] = useState(false);
41
+
42
+ const handleChange = event => {
43
+ setChecked(event.target.checked);
44
+ action('Change event triggered');
45
+ };
46
+
47
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
48
+ as: "form",
49
+ sx: {
50
+ p: 3,
51
+ display: 'flex',
52
+ alignItems: 'flex-start'
53
+ }
54
+ }, /*#__PURE__*/React.createElement(Checkbox, _extends({
55
+ id: "controlled-checkbox",
56
+ onChange: handleChange,
57
+ checked: isChecked
58
+ }, args)), /*#__PURE__*/React.createElement(StyledLabel, {
59
+ htmlFor: "controlled-checkbox"
60
+ }, /*#__PURE__*/React.createElement(Text, {
61
+ sx: {
62
+ display: 'block'
63
+ }
64
+ }, "Default checkbox"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "controlled"))), /*#__PURE__*/React.createElement(Box, {
65
+ as: "form",
66
+ sx: {
67
+ p: 3,
68
+ display: 'flex',
69
+ alignItems: 'flex-start'
70
+ }
71
+ }, /*#__PURE__*/React.createElement(Checkbox, _extends({
72
+ id: "always-checked-checkbox",
73
+ checked: true
74
+ }, args)), /*#__PURE__*/React.createElement(StyledLabel, {
75
+ htmlFor: "always-checked-checkbox"
76
+ }, /*#__PURE__*/React.createElement(Text, {
77
+ sx: {
78
+ display: 'block'
79
+ }
80
+ }, "Always checked"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "checked=\"true\""))), /*#__PURE__*/React.createElement(Box, {
81
+ as: "form",
82
+ sx: {
83
+ p: 3,
84
+ display: 'flex',
85
+ alignItems: 'flex-start'
86
+ }
87
+ }, /*#__PURE__*/React.createElement(Checkbox, _extends({
88
+ id: "always-unchecked-checkbox",
89
+ checked: false
90
+ }, args)), /*#__PURE__*/React.createElement(StyledLabel, {
91
+ htmlFor: "always-unchecked-checkbox"
92
+ }, /*#__PURE__*/React.createElement(Text, {
93
+ sx: {
94
+ display: 'block'
95
+ }
96
+ }, "Always unchecked"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "checked=\"false\""))), /*#__PURE__*/React.createElement(Box, {
97
+ as: "form",
98
+ sx: {
99
+ p: 3,
100
+ display: 'flex',
101
+ alignItems: 'flex-start'
102
+ }
103
+ }, /*#__PURE__*/React.createElement(Checkbox, {
104
+ id: "disabled-checkbox",
105
+ disabled: true,
106
+ checked: false
107
+ }), /*#__PURE__*/React.createElement(StyledLabel, {
108
+ htmlFor: "disabled-checkbox"
109
+ }, /*#__PURE__*/React.createElement(Text, {
110
+ sx: {
111
+ display: 'block'
112
+ }
113
+ }, "Inactive"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "disabled=\"true\""))));
114
+ };
115
+ export const Uncontrolled = args => {
116
+ const checkboxRef = useRef(null);
117
+ useLayoutEffect(() => {
118
+ if (checkboxRef.current) {
119
+ checkboxRef.current.checked = true;
120
+ }
121
+ }, []);
122
+ return /*#__PURE__*/React.createElement(Box, {
123
+ as: "form",
124
+ sx: {
125
+ p: 3,
126
+ display: 'flex',
127
+ alignItems: 'flex-start'
128
+ }
129
+ }, /*#__PURE__*/React.createElement(Checkbox, _extends({
130
+ id: "uncontrolled-checkbox",
131
+ ref: checkboxRef
132
+ }, args)), /*#__PURE__*/React.createElement(StyledLabel, {
133
+ htmlFor: "uncontrolled-checkbox"
134
+ }, /*#__PURE__*/React.createElement(Text, {
135
+ sx: {
136
+ display: 'block'
137
+ }
138
+ }, "Uncontrolled checkbox"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "Checked by default")));
139
+ };
140
+ Uncontrolled.displayName = "Uncontrolled";
141
+ export const Indeterminate = args => {
142
+ const [checkboxes, setCheckboxes] = useState([false, false, false, false]);
143
+
144
+ const handleChange = (_, index) => {
145
+ const newCheckboxes = [...checkboxes];
146
+ newCheckboxes[index] = !checkboxes[index];
147
+ setCheckboxes(newCheckboxes);
148
+ };
149
+
150
+ const handleIndeterminateChange = () => {
151
+ if (checkboxes.every(checkbox => checkbox)) {
152
+ return setCheckboxes(checkboxes.map(() => false));
153
+ }
154
+
155
+ const newCheckboxes = checkboxes.map(() => true);
156
+ setCheckboxes(newCheckboxes);
157
+ };
158
+
159
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
160
+ as: "form",
161
+ sx: {
162
+ p: 3,
163
+ display: 'flex',
164
+ alignItems: 'flex-start'
165
+ }
166
+ }, /*#__PURE__*/React.createElement(Checkbox, {
167
+ id: "indeterminate-checkbox",
168
+ checked: checkboxes.every(Boolean),
169
+ onChange: handleIndeterminateChange,
170
+ indeterminate: !checkboxes.every(Boolean)
171
+ }), /*#__PURE__*/React.createElement(StyledLabel, {
172
+ htmlFor: "controlled-checkbox"
173
+ }, /*#__PURE__*/React.createElement(Text, {
174
+ sx: {
175
+ display: 'block'
176
+ }
177
+ }, "Default checkbox"), /*#__PURE__*/React.createElement(StyledSubLabel, null, "controlled"))), checkboxes.map((field, index) => /*#__PURE__*/React.createElement(Box, {
178
+ key: `sub-checkbox-${index}`,
179
+ as: "form",
180
+ sx: {
181
+ p: 1,
182
+ pl: 7,
183
+ display: 'flex',
184
+ alignItems: 'flex-start'
185
+ }
186
+ }, /*#__PURE__*/React.createElement(Checkbox, _extends({
187
+ id: `sub-checkbox-${index}`,
188
+ checked: checkboxes[index],
189
+ onChange: event => handleChange(event, index)
190
+ }, args)), /*#__PURE__*/React.createElement(StyledLabel, {
191
+ htmlFor: `sub-checkbox-${index}`
192
+ }, /*#__PURE__*/React.createElement(Text, {
193
+ sx: {
194
+ display: 'block'
195
+ }
196
+ }, "Checkbox ", index + 1)))));
197
+ };
@@ -541,4 +541,5 @@ interface BehavesAsComponent {
541
541
  }
542
542
  export declare function behavesAsComponent({ Component, toRender, options }: BehavesAsComponent): void;
543
543
  export declare function checkExports(path: string, exports: Record<any, any>): void;
544
+ export declare function checkStoriesForAxeViolations(name: string): void;
544
545
  export {};
@@ -3,6 +3,8 @@ import { promisify } from 'util';
3
3
  import renderer from 'react-test-renderer';
4
4
  import enzyme from 'enzyme';
5
5
  import Adapter from '@wojtekmaj/enzyme-adapter-react-17';
6
+ import { cleanup, render as HTMLRender } from '@testing-library/react';
7
+ import { axe, toHaveNoViolations } from 'jest-axe';
6
8
  import { ThemeProvider } from '..';
7
9
  import { default as defaultTheme } from '../theme';
8
10
  // eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -219,4 +221,26 @@ export function checkExports(path, exports) {
219
221
 
220
222
  expect(mod).toSetExports(exports);
221
223
  });
224
+ }
225
+ expect.extend(toHaveNoViolations);
226
+ export function checkStoriesForAxeViolations(name) {
227
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
228
+ const stories = require(`../stories/${name}.stories`); // eslint-disable-next-line @typescript-eslint/no-unused-vars -- _meta
229
+
230
+
231
+ const {
232
+ default: _meta,
233
+ ...Stories
234
+ } = stories;
235
+ Object.values(Stories).map(Story => {
236
+ if (typeof Story !== 'function') return;
237
+ it(`story ${Story.storyName} should have no axe violations`, async () => {
238
+ const {
239
+ container
240
+ } = HTMLRender( /*#__PURE__*/React.createElement(Story, null));
241
+ const results = await axe(container);
242
+ expect(results).toHaveNoViolations();
243
+ cleanup();
244
+ });
245
+ });
222
246
  }
package/package-lock.json CHANGED
@@ -46091,13 +46091,118 @@
46091
46091
  }
46092
46092
  },
46093
46093
  "@types/jest": {
46094
- "version": "26.0.23",
46095
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz",
46096
- "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==",
46094
+ "version": "27.0.2",
46095
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz",
46096
+ "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==",
46097
46097
  "dev": true,
46098
46098
  "requires": {
46099
- "jest-diff": "^26.0.0",
46100
- "pretty-format": "^26.0.0"
46099
+ "jest-diff": "^27.0.0",
46100
+ "pretty-format": "^27.0.0"
46101
+ },
46102
+ "dependencies": {
46103
+ "@jest/types": {
46104
+ "version": "27.2.4",
46105
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.4.tgz",
46106
+ "integrity": "sha512-IDO2ezTxeMvQAHxzG/ZvEyA47q0aVfzT95rGFl7bZs/Go0aIucvfDbS2rmnoEdXxlLQhcolmoG/wvL/uKx4tKA==",
46107
+ "dev": true,
46108
+ "requires": {
46109
+ "@types/istanbul-lib-coverage": "^2.0.0",
46110
+ "@types/istanbul-reports": "^3.0.0",
46111
+ "@types/node": "*",
46112
+ "@types/yargs": "^16.0.0",
46113
+ "chalk": "^4.0.0"
46114
+ }
46115
+ },
46116
+ "@types/yargs": {
46117
+ "version": "16.0.4",
46118
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
46119
+ "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
46120
+ "dev": true,
46121
+ "requires": {
46122
+ "@types/yargs-parser": "*"
46123
+ }
46124
+ },
46125
+ "ansi-regex": {
46126
+ "version": "5.0.1",
46127
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
46128
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
46129
+ "dev": true
46130
+ },
46131
+ "ansi-styles": {
46132
+ "version": "5.2.0",
46133
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
46134
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
46135
+ "dev": true
46136
+ },
46137
+ "chalk": {
46138
+ "version": "4.1.2",
46139
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
46140
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
46141
+ "dev": true,
46142
+ "requires": {
46143
+ "ansi-styles": "^4.1.0",
46144
+ "supports-color": "^7.1.0"
46145
+ },
46146
+ "dependencies": {
46147
+ "ansi-styles": {
46148
+ "version": "4.3.0",
46149
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
46150
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
46151
+ "dev": true,
46152
+ "requires": {
46153
+ "color-convert": "^2.0.1"
46154
+ }
46155
+ }
46156
+ }
46157
+ },
46158
+ "color-convert": {
46159
+ "version": "2.0.1",
46160
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
46161
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
46162
+ "dev": true,
46163
+ "requires": {
46164
+ "color-name": "~1.1.4"
46165
+ }
46166
+ },
46167
+ "color-name": {
46168
+ "version": "1.1.4",
46169
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
46170
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
46171
+ "dev": true
46172
+ },
46173
+ "has-flag": {
46174
+ "version": "4.0.0",
46175
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
46176
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
46177
+ "dev": true
46178
+ },
46179
+ "pretty-format": {
46180
+ "version": "27.2.4",
46181
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.4.tgz",
46182
+ "integrity": "sha512-NUjw22WJHldzxyps2YjLZkUj6q1HvjqFezkB9Y2cklN8NtVZN/kZEXGZdFw4uny3oENzV5EEMESrkI0YDUH8vg==",
46183
+ "dev": true,
46184
+ "requires": {
46185
+ "@jest/types": "^27.2.4",
46186
+ "ansi-regex": "^5.0.1",
46187
+ "ansi-styles": "^5.0.0",
46188
+ "react-is": "^17.0.1"
46189
+ }
46190
+ },
46191
+ "react-is": {
46192
+ "version": "17.0.2",
46193
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
46194
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
46195
+ "dev": true
46196
+ },
46197
+ "supports-color": {
46198
+ "version": "7.2.0",
46199
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
46200
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
46201
+ "dev": true,
46202
+ "requires": {
46203
+ "has-flag": "^4.0.0"
46204
+ }
46205
+ }
46101
46206
  }
46102
46207
  },
46103
46208
  "@types/jest-axe": {
@@ -50719,9 +50824,9 @@
50719
50824
  "dev": true
50720
50825
  },
50721
50826
  "diff-sequences": {
50722
- "version": "26.6.2",
50723
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
50724
- "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
50827
+ "version": "27.0.6",
50828
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
50829
+ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
50725
50830
  "dev": true
50726
50831
  },
50727
50832
  "diffie-hellman": {
@@ -55670,17 +55775,45 @@
55670
55775
  }
55671
55776
  },
55672
55777
  "jest-diff": {
55673
- "version": "26.6.2",
55674
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
55675
- "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
55778
+ "version": "27.2.4",
55779
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.4.tgz",
55780
+ "integrity": "sha512-bLAVlDSCR3gqUPGv+4nzVpEXGsHh98HjUL7Vb2hVyyuBDoQmja8eJb0imUABsuxBeUVmf47taJSAd9nDrwWKEg==",
55676
55781
  "dev": true,
55677
55782
  "requires": {
55678
55783
  "chalk": "^4.0.0",
55679
- "diff-sequences": "^26.6.2",
55680
- "jest-get-type": "^26.3.0",
55681
- "pretty-format": "^26.6.2"
55784
+ "diff-sequences": "^27.0.6",
55785
+ "jest-get-type": "^27.0.6",
55786
+ "pretty-format": "^27.2.4"
55682
55787
  },
55683
55788
  "dependencies": {
55789
+ "@jest/types": {
55790
+ "version": "27.2.4",
55791
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.4.tgz",
55792
+ "integrity": "sha512-IDO2ezTxeMvQAHxzG/ZvEyA47q0aVfzT95rGFl7bZs/Go0aIucvfDbS2rmnoEdXxlLQhcolmoG/wvL/uKx4tKA==",
55793
+ "dev": true,
55794
+ "requires": {
55795
+ "@types/istanbul-lib-coverage": "^2.0.0",
55796
+ "@types/istanbul-reports": "^3.0.0",
55797
+ "@types/node": "*",
55798
+ "@types/yargs": "^16.0.0",
55799
+ "chalk": "^4.0.0"
55800
+ }
55801
+ },
55802
+ "@types/yargs": {
55803
+ "version": "16.0.4",
55804
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
55805
+ "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
55806
+ "dev": true,
55807
+ "requires": {
55808
+ "@types/yargs-parser": "*"
55809
+ }
55810
+ },
55811
+ "ansi-regex": {
55812
+ "version": "5.0.1",
55813
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
55814
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
55815
+ "dev": true
55816
+ },
55684
55817
  "ansi-styles": {
55685
55818
  "version": "4.3.0",
55686
55819
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -55691,9 +55824,9 @@
55691
55824
  }
55692
55825
  },
55693
55826
  "chalk": {
55694
- "version": "4.1.1",
55695
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
55696
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
55827
+ "version": "4.1.2",
55828
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
55829
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
55697
55830
  "dev": true,
55698
55831
  "requires": {
55699
55832
  "ansi-styles": "^4.1.0",
@@ -55721,6 +55854,32 @@
55721
55854
  "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
55722
55855
  "dev": true
55723
55856
  },
55857
+ "pretty-format": {
55858
+ "version": "27.2.4",
55859
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.4.tgz",
55860
+ "integrity": "sha512-NUjw22WJHldzxyps2YjLZkUj6q1HvjqFezkB9Y2cklN8NtVZN/kZEXGZdFw4uny3oENzV5EEMESrkI0YDUH8vg==",
55861
+ "dev": true,
55862
+ "requires": {
55863
+ "@jest/types": "^27.2.4",
55864
+ "ansi-regex": "^5.0.1",
55865
+ "ansi-styles": "^5.0.0",
55866
+ "react-is": "^17.0.1"
55867
+ },
55868
+ "dependencies": {
55869
+ "ansi-styles": {
55870
+ "version": "5.2.0",
55871
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
55872
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
55873
+ "dev": true
55874
+ }
55875
+ }
55876
+ },
55877
+ "react-is": {
55878
+ "version": "17.0.2",
55879
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
55880
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
55881
+ "dev": true
55882
+ },
55724
55883
  "supports-color": {
55725
55884
  "version": "7.2.0",
55726
55885
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -56128,9 +56287,9 @@
56128
56287
  }
56129
56288
  },
56130
56289
  "jest-get-type": {
56131
- "version": "26.3.0",
56132
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
56133
- "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
56290
+ "version": "27.0.6",
56291
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
56292
+ "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
56134
56293
  "dev": true
56135
56294
  },
56136
56295
  "jest-haste-map": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/components",
3
- "version": "32.0.2-rc.859381a1",
3
+ "version": "32.1.1-rc.b4502a34",
4
4
  "description": "Primer react components",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -87,7 +87,7 @@
87
87
  "@testing-library/user-event": "13.1.9",
88
88
  "@types/chroma-js": "2.1.3",
89
89
  "@types/enzyme": "3.10.9",
90
- "@types/jest": "26.0.23",
90
+ "@types/jest": "27.0.2",
91
91
  "@types/jest-axe": "3.5.3",
92
92
  "@types/lodash.isempty": "4.4.6",
93
93
  "@types/lodash.isobject": "3.0.6",
@@ -275,6 +275,7 @@ const BaseVisualContainer = styled.div<{variant?: ItemProps['variant']; disabled
275
275
  display: flex;
276
276
  justify-content: center;
277
277
  align-items: center;
278
+ flex-shrink: 0;
278
279
  `
279
280
 
280
281
  const ColoredVisualContainer = styled(BaseVisualContainer)`
@@ -285,7 +286,6 @@ const ColoredVisualContainer = styled(BaseVisualContainer)`
285
286
  `
286
287
 
287
288
  const LeadingVisualContainer = styled(ColoredVisualContainer)`
288
- flex-shrink: 0;
289
289
  display: flex;
290
290
  flex-direction: column;
291
291
  justify-content: center;
@@ -317,6 +317,7 @@ const MultiSelectIcon = styled.svg<{selected?: boolean}>`
317
317
  rect {
318
318
  fill: ${({selected}) => (selected ? get('colors.accent.fg') : get('colors.canvas.default'))};
319
319
  stroke: ${({selected}) => (selected ? get('colors.accent.fg') : get('colors.border.default'))};
320
+ shape-rendering: auto; // this is a workaround to override global style in github/github, see primer/react#1666
320
321
  }
321
322
  path {
322
323
  fill: ${get('colors.fg.onEmphasis')};
@@ -91,7 +91,7 @@ export const Item = React.forwardRef<HTMLLIElement, ItemProps>(
91
91
  variant = 'default',
92
92
  disabled = false,
93
93
  selected = undefined,
94
- onSelect = () => null,
94
+ onSelect,
95
95
  sx: sxProp = {},
96
96
  id,
97
97
  _PrivateItemWrapper,
@@ -168,6 +168,7 @@ export const Item = React.forwardRef<HTMLLIElement, ItemProps>(
168
168
 
169
169
  const clickHandler = React.useCallback(
170
170
  event => {
171
+ if (typeof onSelect !== 'function') return
171
172
  if (disabled) return
172
173
  if (!event.defaultPrevented) onSelect(event)
173
174
  },
@@ -176,8 +177,8 @@ export const Item = React.forwardRef<HTMLLIElement, ItemProps>(
176
177
 
177
178
  const keyPressHandler = React.useCallback(
178
179
  event => {
180
+ if (typeof onSelect !== 'function') return
179
181
  if (disabled) return
180
-
181
182
  if (!event.defaultPrevented && [' ', 'Enter'].includes(event.key)) {
182
183
  onSelect(event)
183
184
  }
@@ -40,12 +40,7 @@ export const List = React.forwardRef<HTMLUListElement, ListProps>(
40
40
  }
41
41
 
42
42
  return (
43
- <ListBox
44
- sx={merge(styles, sxProp as SxProp)}
45
- aria-multiselectable={selectionVariant === 'multiple' ? true : undefined}
46
- {...props}
47
- ref={forwardedRef}
48
- >
43
+ <ListBox sx={merge(styles, sxProp as SxProp)} {...props} ref={forwardedRef}>
49
44
  <ListContext.Provider value={{variant, selectionVariant, showDividers}}>{props.children}</ListContext.Provider>
50
45
  </ListBox>
51
46
  )
@@ -38,7 +38,8 @@ export const Selection: React.FC<SelectionProps> = ({selected}) => {
38
38
  sx={{
39
39
  rect: {
40
40
  fill: selected ? 'accent.fg' : 'canvas.default',
41
- stroke: selected ? 'accent.fg' : 'border.default'
41
+ stroke: selected ? 'accent.fg' : 'border.default',
42
+ shapeRendering: 'auto' // this is a workaround to override global style in github/github, see primer/react#1666
42
43
  },
43
44
  path: {
44
45
  fill: 'fg.onEmphasis',
@@ -0,0 +1,75 @@
1
+ import styled from 'styled-components'
2
+ import {useProvidedRefOrCreate} from './hooks'
3
+ import React, {InputHTMLAttributes, ReactElement, useLayoutEffect} from 'react'
4
+ import sx, {SxProp} from './sx'
5
+
6
+ export type CheckboxProps = {
7
+ /**
8
+ * Apply indeterminate visual appearance to the checkbox
9
+ */
10
+ indeterminate?: boolean
11
+ /**
12
+ * Apply inactive visual appearance to the checkbox
13
+ */
14
+ disabled?: boolean
15
+ /**
16
+ * Forward a ref to the underlying input element
17
+ */
18
+ ref?: React.RefObject<HTMLInputElement>
19
+ /**
20
+ * Indicates whether the checkbox must be checked
21
+ */
22
+ required?: boolean
23
+
24
+ /**
25
+ * Indicates whether the checkbox validation state
26
+ */
27
+ validationStatus?: 'error' | 'success' // TODO: hoist to Validation typings
28
+ } & InputHTMLAttributes<HTMLInputElement> &
29
+ SxProp
30
+
31
+ const StyledCheckbox = styled.input`
32
+ cursor: pointer;
33
+
34
+ ${props => props.disabled && `cursor: not-allowed;`}
35
+
36
+ ${sx}
37
+ `
38
+
39
+ /**
40
+ * An accessible, native checkbox component
41
+ */
42
+ const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
43
+ (
44
+ {checked, indeterminate, disabled, sx: sxProp, required, validationStatus, ...rest}: CheckboxProps,
45
+ ref
46
+ ): ReactElement => {
47
+ const checkboxRef = useProvidedRefOrCreate(ref as React.RefObject<HTMLInputElement>)
48
+
49
+ useLayoutEffect(() => {
50
+ if (checkboxRef.current) {
51
+ checkboxRef.current.indeterminate = indeterminate || false
52
+ }
53
+ }, [indeterminate, checked, checkboxRef])
54
+
55
+ return (
56
+ <StyledCheckbox
57
+ type="checkbox"
58
+ disabled={disabled}
59
+ aria-disabled={disabled ? 'true' : 'false'}
60
+ ref={ref || checkboxRef}
61
+ checked={indeterminate ? false : checked}
62
+ aria-checked={indeterminate ? 'mixed' : checked ? 'true' : 'false'}
63
+ sx={sxProp}
64
+ required={required}
65
+ aria-required={required ? 'true' : 'false'}
66
+ aria-invalid={validationStatus === 'error' ? 'true' : 'false'}
67
+ {...rest}
68
+ />
69
+ )
70
+ }
71
+ )
72
+
73
+ Checkbox.displayName = 'Checkbox'
74
+
75
+ export default Checkbox