@primer/components 31.2.0-rc.85bcb6e0 → 31.2.0-rc.881e6b2d

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 (134) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/browser.esm.js +620 -618
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +188 -186
  5. package/dist/browser.umd.js.map +1 -1
  6. package/docs/content/ActionList2.mdx +354 -0
  7. package/docs/content/StateLabel.md +5 -4
  8. package/docs/content/getting-started.md +1 -1
  9. package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +1 -3
  10. package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +1 -1
  11. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +17 -0
  12. package/lib/ActionList2/Description.d.ts +12 -0
  13. package/lib/ActionList2/Description.js +53 -0
  14. package/lib/ActionList2/Divider.d.ts +5 -0
  15. package/lib/ActionList2/Divider.js +35 -0
  16. package/lib/ActionList2/Group.d.ts +11 -0
  17. package/lib/ActionList2/Group.js +57 -0
  18. package/lib/ActionList2/Header.d.ts +26 -0
  19. package/lib/ActionList2/Header.js +55 -0
  20. package/lib/ActionList2/Item.d.ts +63 -0
  21. package/lib/ActionList2/Item.js +244 -0
  22. package/lib/ActionList2/LinkItem.d.ts +17 -0
  23. package/lib/ActionList2/LinkItem.js +57 -0
  24. package/lib/ActionList2/List.d.ts +26 -0
  25. package/lib/ActionList2/List.js +59 -0
  26. package/lib/ActionList2/Selection.d.ts +5 -0
  27. package/lib/ActionList2/Selection.js +70 -0
  28. package/lib/ActionList2/Visuals.d.ts +9 -0
  29. package/lib/ActionList2/Visuals.js +90 -0
  30. package/lib/ActionList2/index.d.ts +36 -0
  31. package/lib/ActionList2/index.js +47 -0
  32. package/lib/StateLabel.d.ts +1 -1
  33. package/lib/StateLabel.js +6 -1
  34. package/lib/_TextInputWrapper.js +2 -2
  35. package/lib/__tests__/ActionList2.test.d.ts +1 -0
  36. package/lib/__tests__/ActionList2.test.js +53 -0
  37. package/lib/__tests__/AnchoredOverlay.test.js +4 -2
  38. package/lib/__tests__/TextInputWithTokens.test.js +1 -10
  39. package/lib/__tests__/utils/createSlots.test.d.ts +1 -0
  40. package/lib/__tests__/utils/createSlots.test.js +75 -0
  41. package/lib/stories/ActionList2.stories.js +907 -0
  42. package/lib/stories/TextInput.stories.js +144 -0
  43. package/lib/sx.d.ts +2 -0
  44. package/lib/sx.js +8 -0
  45. package/lib/theme-preval.js +81 -2
  46. package/lib/unreleased.d.ts +7 -0
  47. package/lib/unreleased.js +18 -0
  48. package/lib/utils/create-slots.d.ts +17 -0
  49. package/lib/utils/create-slots.js +105 -0
  50. package/lib/utils/testing.d.ts +14 -1
  51. package/lib/utils/use-force-update.d.ts +1 -0
  52. package/lib/utils/use-force-update.js +19 -0
  53. package/lib-esm/ActionList2/Description.d.ts +12 -0
  54. package/lib-esm/ActionList2/Description.js +37 -0
  55. package/lib-esm/ActionList2/Divider.d.ts +5 -0
  56. package/lib-esm/ActionList2/Divider.js +23 -0
  57. package/lib-esm/ActionList2/Group.d.ts +11 -0
  58. package/lib-esm/ActionList2/Group.js +40 -0
  59. package/lib-esm/ActionList2/Header.d.ts +26 -0
  60. package/lib-esm/ActionList2/Header.js +44 -0
  61. package/lib-esm/ActionList2/Item.d.ts +63 -0
  62. package/lib-esm/ActionList2/Item.js +210 -0
  63. package/lib-esm/ActionList2/LinkItem.d.ts +17 -0
  64. package/lib-esm/ActionList2/LinkItem.js +43 -0
  65. package/lib-esm/ActionList2/List.d.ts +26 -0
  66. package/lib-esm/ActionList2/List.js +37 -0
  67. package/lib-esm/ActionList2/Selection.d.ts +5 -0
  68. package/lib-esm/ActionList2/Selection.js +52 -0
  69. package/lib-esm/ActionList2/Visuals.d.ts +9 -0
  70. package/lib-esm/ActionList2/Visuals.js +68 -0
  71. package/lib-esm/ActionList2/index.d.ts +36 -0
  72. package/lib-esm/ActionList2/index.js +33 -0
  73. package/lib-esm/StateLabel.d.ts +1 -1
  74. package/lib-esm/StateLabel.js +7 -2
  75. package/lib-esm/_TextInputWrapper.js +2 -2
  76. package/lib-esm/__tests__/ActionList2.test.d.ts +1 -0
  77. package/lib-esm/__tests__/ActionList2.test.js +41 -0
  78. package/lib-esm/__tests__/AnchoredOverlay.test.js +4 -2
  79. package/lib-esm/__tests__/TextInputWithTokens.test.js +1 -10
  80. package/lib-esm/__tests__/utils/createSlots.test.d.ts +1 -0
  81. package/lib-esm/__tests__/utils/createSlots.test.js +67 -0
  82. package/lib-esm/stories/ActionList2.stories.js +796 -0
  83. package/lib-esm/stories/TextInput.stories.js +117 -0
  84. package/lib-esm/sx.d.ts +2 -0
  85. package/lib-esm/sx.js +3 -1
  86. package/lib-esm/theme-preval.js +81 -2
  87. package/lib-esm/unreleased.d.ts +7 -0
  88. package/lib-esm/unreleased.js +8 -0
  89. package/lib-esm/utils/create-slots.d.ts +17 -0
  90. package/lib-esm/utils/create-slots.js +84 -0
  91. package/lib-esm/utils/testing.d.ts +14 -1
  92. package/lib-esm/utils/use-force-update.d.ts +1 -0
  93. package/lib-esm/utils/use-force-update.js +6 -0
  94. package/migrating.md +1 -1
  95. package/package-lock.json +153 -14
  96. package/package.json +6 -4
  97. package/src/ActionList2/Description.tsx +49 -0
  98. package/src/ActionList2/Divider.tsx +24 -0
  99. package/src/ActionList2/Group.tsx +34 -0
  100. package/src/ActionList2/Header.tsx +58 -0
  101. package/src/ActionList2/Item.tsx +245 -0
  102. package/src/ActionList2/LinkItem.tsx +49 -0
  103. package/src/ActionList2/List.tsx +55 -0
  104. package/src/ActionList2/Selection.tsx +40 -0
  105. package/src/ActionList2/Visuals.tsx +76 -0
  106. package/src/ActionList2/index.ts +39 -0
  107. package/src/StateLabel.tsx +14 -2
  108. package/src/_TextInputWrapper.tsx +7 -0
  109. package/src/__tests__/ActionList2.test.tsx +47 -0
  110. package/src/__tests__/AnchoredOverlay.test.tsx +2 -2
  111. package/src/__tests__/TextInputWithTokens.test.tsx +0 -10
  112. package/src/__tests__/__snapshots__/ActionList2.test.tsx.snap +14 -0
  113. package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +35 -135
  114. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +1 -0
  115. package/src/__tests__/__snapshots__/CircleBadge.test.tsx.snap +1 -0
  116. package/src/__tests__/__snapshots__/CircleOcticon.test.tsx.snap +1 -0
  117. package/src/__tests__/__snapshots__/Dialog.test.tsx.snap +1 -0
  118. package/src/__tests__/__snapshots__/DropdownMenu.test.tsx.snap +1 -0
  119. package/src/__tests__/__snapshots__/SelectMenu.test.tsx.snap +4 -0
  120. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -0
  121. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +13 -6
  122. package/src/__tests__/__snapshots__/StyledOcticon.test.tsx.snap +1 -0
  123. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +66 -0
  124. package/src/__tests__/__snapshots__/Token.test.tsx.snap +17 -0
  125. package/src/__tests__/utils/__snapshots__/createSlots.test.tsx.snap +55 -0
  126. package/src/__tests__/utils/createSlots.test.tsx +74 -0
  127. package/src/stories/ActionList2.stories.tsx +1288 -0
  128. package/src/stories/TextInput.stories.tsx +113 -0
  129. package/src/sx.ts +3 -0
  130. package/src/theme-preval.js +1 -0
  131. package/src/unreleased.ts +9 -0
  132. package/src/utils/create-slots.tsx +96 -0
  133. package/src/utils/use-force-update.ts +7 -0
  134. package/stats.html +1 -1
@@ -4,7 +4,7 @@ import { SxProp } from './sx';
4
4
  import { ComponentProps } from './utils/types';
5
5
  declare const StateLabelBase: import("styled-components").StyledComponent<"span", any, {
6
6
  variant?: "small" | "normal" | undefined;
7
- status?: "issueClosed" | "pullClosed" | "pullMerged" | "issueOpened" | "pullOpened" | "draft" | undefined;
7
+ status?: "issueClosed" | "pullClosed" | "pullMerged" | "issueOpened" | "pullOpened" | "draft" | "issueDraft" | undefined;
8
8
  } & SystemCommonProps & SxProp, never>;
9
9
  export declare type StateLabelProps = ComponentProps<typeof StateLabelBase>;
10
10
  declare function StateLabel({ children, status, variant: variantProp, ...rest }: StateLabelProps): JSX.Element;
@@ -1,6 +1,6 @@
1
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
2
 
3
- import { GitMergeIcon, GitPullRequestIcon, IssueClosedIcon, IssueOpenedIcon, QuestionIcon } from '@primer/octicons-react';
3
+ import { GitMergeIcon, GitPullRequestIcon, IssueClosedIcon, IssueDraftIcon, IssueOpenedIcon, QuestionIcon } from '@primer/octicons-react';
4
4
  import React from 'react';
5
5
  import styled from 'styled-components';
6
6
  import { variant } from 'styled-system';
@@ -13,7 +13,8 @@ const octiconMap = {
13
13
  issueClosed: IssueClosedIcon,
14
14
  pullClosed: GitPullRequestIcon,
15
15
  pullMerged: GitMergeIcon,
16
- draft: GitPullRequestIcon
16
+ draft: GitPullRequestIcon,
17
+ issueDraft: IssueDraftIcon
17
18
  };
18
19
  const colorVariants = variant({
19
20
  prop: 'status',
@@ -41,6 +42,10 @@ const colorVariants = variant({
41
42
  draft: {
42
43
  backgroundColor: 'neutral.emphasis',
43
44
  color: 'fg.onEmphasis'
45
+ },
46
+ issueDraft: {
47
+ backgroundColor: 'neutral.emphasis',
48
+ color: 'fg.onEmphasis'
44
49
  }
45
50
  }
46
51
  });
@@ -21,11 +21,11 @@ const sizeVariants = variant({
21
21
  const TextInputWrapper = styled.span.withConfig({
22
22
  displayName: "_TextInputWrapper__TextInputWrapper",
23
23
  componentId: "sc-5vfcis-0"
24
- })(["display:inline-flex;align-items:stretch;min-height:34px;font-size:", ";line-height:20px;color:", ";vertical-align:middle;background-repeat:no-repeat;background-position:right 8px center;border:1px solid ", ";border-radius:", ";outline:none;box-shadow:", ";cursor:text;", " .TextInput-icon{align-self:center;color:", ";margin:0 ", ";flex-shrink:0;}&:focus-within{border-color:", ";box-shadow:", ";}", " ", " ", " @media (min-width:", "){font-size:", ";}", " ", " ", " ", " ", ";"], get('fontSizes.1'), get('colors.fg.default'), get('colors.border.default'), get('radii.2'), get('shadows.primer.shadow.inset'), props => {
24
+ })(["display:inline-flex;align-items:stretch;min-height:34px;font-size:", ";line-height:20px;color:", ";vertical-align:middle;background-repeat:no-repeat;background-position:right 8px center;border:1px solid ", ";border-radius:", ";outline:none;box-shadow:", ";cursor:text;", " .TextInput-icon{align-self:center;color:", ";margin:0 ", ";flex-shrink:0;}&:focus-within{border-color:", ";box-shadow:", ";}", " ", " ", " ", " @media (min-width:", "){font-size:", ";}", " ", " ", " ", " ", ";"], get('fontSizes.1'), get('colors.fg.default'), get('colors.border.default'), get('radii.2'), get('shadows.primer.shadow.inset'), props => {
25
25
  if (props.hasIcon) {
26
26
  return css(["padding:0;"]);
27
27
  } else {
28
28
  return css(["padding:6px 12px;"]);
29
29
  }
30
- }, get('colors.fg.muted'), get('space.2'), get('colors.accent.emphasis'), get('shadows.primer.shadow.focus'), props => props.contrast && css(["background-color:", ";"], get('colors.canvas.inset')), props => props.disabled && css(["color:", ";background-color:", ";border-color:", ";"], get('colors.primer.fg.disabled'), get('colors.input.disabledBg'), get('colors.border.default')), props => props.block && css(["display:block;width:100%;"]), get('breakpoints.1'), get('fontSizes.1'), width, minWidth, maxWidth, sizeVariants, sx);
30
+ }, get('colors.fg.muted'), get('space.2'), get('colors.accent.emphasis'), get('shadows.primer.shadow.focus'), props => props.contrast && css(["background-color:", ";"], get('colors.canvas.inset')), props => props.disabled && css(["color:", ";background-color:", ";border-color:", ";"], get('colors.primer.fg.disabled'), get('colors.input.disabledBg'), get('colors.border.default')), props => props.block && css(["display:block;width:100%;"]), props => props.block && props.hasIcon && css(["display:flex;"]), get('breakpoints.1'), get('fontSizes.1'), width, minWidth, maxWidth, sizeVariants, sx);
31
31
  export default TextInputWrapper;
@@ -0,0 +1 @@
1
+ import 'babel-polyfill';
@@ -0,0 +1,41 @@
1
+ import { cleanup, render as HTMLRender } from '@testing-library/react';
2
+ import 'babel-polyfill';
3
+ import { axe, toHaveNoViolations } from 'jest-axe';
4
+ import React from 'react';
5
+ import theme from '../theme';
6
+ import { ActionList } from '../ActionList2';
7
+ import { behavesAsComponent, checkExports } from '../utils/testing';
8
+ import { BaseStyles, ThemeProvider, SSRProvider } from '..';
9
+ expect.extend(toHaveNoViolations);
10
+
11
+ function SimpleActionList() {
12
+ return /*#__PURE__*/React.createElement(ThemeProvider, {
13
+ theme: theme
14
+ }, /*#__PURE__*/React.createElement(SSRProvider, null, /*#__PURE__*/React.createElement(BaseStyles, null, /*#__PURE__*/React.createElement(ActionList, null, /*#__PURE__*/React.createElement(ActionList.Item, null, "New file"), /*#__PURE__*/React.createElement(ActionList.Divider, null), /*#__PURE__*/React.createElement(ActionList.Item, null, "Copy link"), /*#__PURE__*/React.createElement(ActionList.Item, null, "Edit file"), /*#__PURE__*/React.createElement(ActionList.Item, {
15
+ variant: "danger"
16
+ }, "Delete file")))));
17
+ }
18
+
19
+ SimpleActionList.displayName = "SimpleActionList";
20
+ describe('ActionList', () => {
21
+ behavesAsComponent({
22
+ Component: ActionList,
23
+ options: {
24
+ skipAs: true,
25
+ skipSx: true
26
+ },
27
+ toRender: () => /*#__PURE__*/React.createElement(ActionList, null)
28
+ });
29
+ checkExports('ActionList2', {
30
+ default: undefined,
31
+ ActionList
32
+ });
33
+ it('should have no axe violations', async () => {
34
+ const {
35
+ container
36
+ } = HTMLRender( /*#__PURE__*/React.createElement(SimpleActionList, null));
37
+ const results = await axe(container);
38
+ expect(results).toHaveNoViolations();
39
+ cleanup();
40
+ });
41
+ });
@@ -126,9 +126,11 @@ describe('AnchoredOverlay', () => {
126
126
  expect(mockCloseCallback).toHaveBeenCalledWith('escape');
127
127
  });
128
128
  it('should render consistently when open', () => {
129
- const anchoredOverlay = HTMLRender( /*#__PURE__*/React.createElement(AnchoredOverlayTestComponent, {
129
+ const {
130
+ container
131
+ } = HTMLRender( /*#__PURE__*/React.createElement(AnchoredOverlayTestComponent, {
130
132
  initiallyOpen: true
131
133
  }));
132
- expect(anchoredOverlay).toMatchSnapshot();
134
+ expect(container).toMatchSnapshot();
133
135
  });
134
136
  });
@@ -46,16 +46,7 @@ const LabelledTextInputWithTokens = ({
46
46
  tokens: tokens,
47
47
  onTokenRemove: onTokenRemove,
48
48
  id: "tokenInput"
49
- }, rest))); // describe('axe test', () => {
50
- // it('should have no axe violations', async () => {
51
- // const onRemoveMock = jest.fn()
52
- // const {container} = HTMLRender(<LabelledTextInputWithTokens tokens={mockTokens} onTokenRemove={onRemoveMock} />)
53
- // const results = await axe(container)
54
- // expect(results).toHaveNoViolations()
55
- // cleanup()
56
- // })
57
- // })
58
-
49
+ }, rest)));
59
50
 
60
51
  jest.useFakeTimers();
61
52
  describe('TextInputWithTokens', () => {
@@ -0,0 +1 @@
1
+ import 'babel-polyfill';
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ import 'babel-polyfill';
3
+ import { render, waitFor } from '@testing-library/react';
4
+ import createSlots from '../../utils/create-slots'; // setup a component with slots
5
+
6
+ const {
7
+ Slots,
8
+ Slot
9
+ } = createSlots(['One', 'Two', 'Three']);
10
+
11
+ const ComponentWithSlots = ({
12
+ salutation,
13
+ children
14
+ }) => {
15
+ return /*#__PURE__*/React.createElement(Slots, {
16
+ context: {
17
+ salutation
18
+ }
19
+ }, slots => /*#__PURE__*/React.createElement("div", null, slots.One, /*#__PURE__*/React.createElement("span", null, children, " ", slots.Two, " ", slots.Three)));
20
+ };
21
+
22
+ ComponentWithSlots.displayName = "ComponentWithSlots";
23
+
24
+ const SlotItem1 = ({
25
+ children
26
+ }) => /*#__PURE__*/React.createElement(Slot, {
27
+ name: "One"
28
+ }, children);
29
+
30
+ SlotItem1.displayName = "SlotItem1";
31
+
32
+ const SlotItem2 = ({
33
+ children
34
+ }) => /*#__PURE__*/React.createElement(Slot, {
35
+ name: "Two"
36
+ }, children);
37
+
38
+ SlotItem2.displayName = "SlotItem2";
39
+
40
+ const SlotItem3 = ({
41
+ children
42
+ }) => /*#__PURE__*/React.createElement(Slot, {
43
+ name: "Three"
44
+ }, context => /*#__PURE__*/React.createElement(React.Fragment, null, context.salutation, " ", children));
45
+
46
+ SlotItem3.displayName = "SlotItem3";
47
+ describe('ComponentWithSlots', () => {
48
+ it('renders all slots', async () => {
49
+ const component = render( /*#__PURE__*/React.createElement(ComponentWithSlots, null, /*#__PURE__*/React.createElement(SlotItem1, null, "first"), /*#__PURE__*/React.createElement(SlotItem2, null, "second"), "free form"));
50
+ await waitFor(() => component.getByText('first'));
51
+ expect(component.container).toMatchSnapshot();
52
+ });
53
+ it('renders without any slots', async () => {
54
+ const component = render( /*#__PURE__*/React.createElement(ComponentWithSlots, null, "free form"));
55
+ expect(component.container).toMatchSnapshot();
56
+ });
57
+ it('renders with just one slot', async () => {
58
+ const component = render( /*#__PURE__*/React.createElement(ComponentWithSlots, null, /*#__PURE__*/React.createElement(SlotItem1, null, "first"), "free form"));
59
+ expect(component.container).toMatchSnapshot();
60
+ });
61
+ it('renders with context passed to children', async () => {
62
+ const component = render( /*#__PURE__*/React.createElement(ComponentWithSlots, {
63
+ salutation: "hi"
64
+ }, /*#__PURE__*/React.createElement(SlotItem3, null, "third"), "free form"));
65
+ expect(component.container).toMatchSnapshot();
66
+ });
67
+ });