@primer/components 31.2.0-rc.c285489d → 31.2.0-rc.c7f73427

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 (62) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/browser.esm.js +180 -178
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +182 -180
  5. package/dist/browser.umd.js.map +1 -1
  6. package/docs/content/FilterList.md +2 -2
  7. package/docs/content/theming.md +23 -0
  8. package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +1 -3
  9. package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +1 -1
  10. package/lib/ActionList/Header.js +1 -1
  11. package/lib/Overlay.js +3 -1
  12. package/lib/Portal/Portal.js +3 -2
  13. package/lib/_TextInputWrapper.js +2 -2
  14. package/lib/__tests__/AnchoredOverlay.test.js +4 -2
  15. package/lib/__tests__/KeyPaths.types.test.d.ts +2 -1
  16. package/lib/__tests__/TextInputWithTokens.test.js +1 -10
  17. package/lib/hooks/useAnchoredPosition.js +3 -2
  18. package/lib/hooks/useCombinedRefs.d.ts +2 -2
  19. package/lib/hooks/useCombinedRefs.js +4 -6
  20. package/lib/hooks/useResizeObserver.js +2 -2
  21. package/lib/stories/TextInput.stories.js +144 -0
  22. package/lib/stories/Token.stories.js +19 -2
  23. package/lib/utils/types/KeyPaths.d.ts +1 -1
  24. package/lib/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  25. package/lib/utils/useIsomorphicLayoutEffect.js +12 -0
  26. package/lib-esm/ActionList/Header.js +1 -1
  27. package/lib-esm/Overlay.js +2 -1
  28. package/lib-esm/Portal/Portal.js +2 -1
  29. package/lib-esm/_TextInputWrapper.js +2 -2
  30. package/lib-esm/__tests__/AnchoredOverlay.test.js +4 -2
  31. package/lib-esm/__tests__/KeyPaths.types.test.d.ts +2 -1
  32. package/lib-esm/__tests__/TextInputWithTokens.test.js +1 -10
  33. package/lib-esm/hooks/useAnchoredPosition.js +2 -1
  34. package/lib-esm/hooks/useCombinedRefs.d.ts +2 -2
  35. package/lib-esm/hooks/useCombinedRefs.js +3 -2
  36. package/lib-esm/hooks/useResizeObserver.js +2 -2
  37. package/lib-esm/stories/TextInput.stories.js +117 -0
  38. package/lib-esm/stories/Token.stories.js +14 -1
  39. package/lib-esm/utils/types/KeyPaths.d.ts +1 -1
  40. package/lib-esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  41. package/lib-esm/utils/useIsomorphicLayoutEffect.js +3 -0
  42. package/migrating.md +1 -1
  43. package/package-lock.json +15 -2
  44. package/package.json +3 -2
  45. package/script/build +2 -0
  46. package/src/ActionList/Header.tsx +1 -1
  47. package/src/Overlay.tsx +2 -1
  48. package/src/Portal/Portal.tsx +2 -1
  49. package/src/_TextInputWrapper.tsx +7 -0
  50. package/src/__tests__/AnchoredOverlay.test.tsx +2 -2
  51. package/src/__tests__/KeyPaths.types.test.ts +2 -1
  52. package/src/__tests__/TextInputWithTokens.test.tsx +0 -10
  53. package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +35 -135
  54. package/src/hooks/useAnchoredPosition.ts +2 -1
  55. package/src/hooks/useCombinedRefs.ts +3 -3
  56. package/src/hooks/useResizeObserver.ts +2 -2
  57. package/src/stories/Button.stories.tsx +1 -1
  58. package/src/stories/TextInput.stories.tsx +113 -0
  59. package/src/stories/Token.stories.tsx +12 -1
  60. package/src/utils/types/KeyPaths.ts +7 -1
  61. package/src/utils/useIsomorphicLayoutEffect.ts +10 -0
  62. package/stats.html +1 -1
@@ -8,10 +8,10 @@ The FilterList component is a menu with filter options that filter the main cont
8
8
 
9
9
  ```jsx live
10
10
  <FilterList>
11
- <FilterList.Item selected count="32" href="#foo">
11
+ <FilterList.Item selected count={32} href="#foo">
12
12
  First Filter
13
13
  </FilterList.Item>
14
- <FilterList.Item count="2" href="#bar">
14
+ <FilterList.Item count={2} href="#bar">
15
15
  Second Filter
16
16
  </FilterList.Item>
17
17
  <FilterList.Item href="#baz">Third Filter</FilterList.Item>
@@ -3,6 +3,8 @@ title: Theming
3
3
  description: Theming in Primer React is made possible by a theme object that defines your application's colors, spacing, fonts, and more.
4
4
  ---
5
5
 
6
+ import Code from '@primer/gatsby-theme-doctocat/src/components/code'
7
+
6
8
  ## ThemeProvider
7
9
 
8
10
  To give components access to the theme object, you must add `ThemeProvider` to the root of your application:
@@ -50,6 +52,27 @@ Some components may break if your custom theme does not include all the same key
50
52
 
51
53
  You can reference theme values in your application using [system props](/system-props), the [`sx` prop](/overriding-styles), the `themeGet` function, or the `useTheme` hook.
52
54
 
55
+ <Note variant="warning">
56
+
57
+ Only use `theme` objects accessed via Primer's theme context to ensure your application’s styling draws from the same theme as Primer components’ internal styling. The `sx` prop, styled system props, `themeGet`, and `useTheme` all use the theme from context.
58
+
59
+ <DoDontContainer>
60
+ <Do>
61
+ <Code className="language-jsx">
62
+ {`<Box textShadow="shadow.medium">`}
63
+ </Code>
64
+ <Caption>Use the theme from the same context as Primer.</Caption>
65
+ </Do>
66
+ <Dont>
67
+ <Code className="language-jsx">
68
+ {`import {theme} from '@primer/components'\n\n<Box textShadow={theme.shadows.shadow.medium}>`}
69
+ </Code>
70
+ <Caption>Don't style components with any other instance of theme</Caption>
71
+ </Dont>
72
+ </DoDontContainer>
73
+
74
+ </Note>
75
+
53
76
  ### System props and the `sx` prop
54
77
 
55
78
  Some [system props](/system-props) and [`sx` prop](/overriding-styles) keys are theme-aware. For example, the `bg` prop maps to the `colors` theme key which means you can use the `bg` prop to reference values in the `colors` object:
@@ -9,9 +9,7 @@ export default function Hero() {
9
9
  <ThemeProvider colorMode="night" nightScheme="dark_dimmed">
10
10
  <Box bg="canvas.default" py={6}>
11
11
  <Container>
12
- <Heading color="accent.fg" fontSize={7} lineHeight="condensed" pb={3} m={0}>
13
- Primer React
14
- </Heading>
12
+ <Heading sx={{color: 'accent.fg', fontSize: 7, lineHeight: 'condensed', pb: 3, m: 0}}>Primer React</Heading>
15
13
  <Text as="p" fontFamily="mono" mt={0} mb={2} color="fg.default" fontSize={2}>
16
14
  v{version}
17
15
  </Text>
@@ -8,7 +8,7 @@ function ThemeSwitcher() {
8
8
  return (
9
9
  <DropdownMenu
10
10
  renderAnchor={({children, ...anchorProps}) => (
11
- <DropdownButton variant="small" {...anchorProps}>
11
+ <DropdownButton {...anchorProps} sx={{variant: 'small'}}>
12
12
  {children}
13
13
  </DropdownButton>
14
14
  )}
@@ -45,7 +45,7 @@ function Header({
45
45
  return /*#__PURE__*/_react.default.createElement(StyledHeader, _extends({
46
46
  role: "heading",
47
47
  variant: variant
48
- }, props), title, auxiliaryText && /*#__PURE__*/_react.default.createElement("span", null, "auxiliaryText"));
48
+ }, props), title, auxiliaryText && /*#__PURE__*/_react.default.createElement("span", null, auxiliaryText));
49
49
  }
50
50
 
51
51
  Header.displayName = "Header";
package/lib/Overlay.js CHANGED
@@ -11,6 +11,8 @@ var _react = _interopRequireWildcard(require("react"));
11
11
 
12
12
  var _constants = require("./constants");
13
13
 
14
+ var _useIsomorphicLayoutEffect = _interopRequireDefault(require("./utils/useIsomorphicLayoutEffect"));
15
+
14
16
  var _hooks = require("./hooks");
15
17
 
16
18
  var _Portal = _interopRequireDefault(require("./Portal"));
@@ -139,7 +141,7 @@ const Overlay = /*#__PURE__*/_react.default.forwardRef(({
139
141
  combinedRef.current.style.height = `${combinedRef.current.clientHeight}px`;
140
142
  }
141
143
  }, [height, combinedRef]);
142
- (0, _react.useLayoutEffect)(() => {
144
+ (0, _useIsomorphicLayoutEffect.default)(() => {
143
145
  var _overlayRef$current;
144
146
 
145
147
  const {
@@ -10,6 +10,8 @@ var _react = _interopRequireDefault(require("react"));
10
10
 
11
11
  var _reactDom = require("react-dom");
12
12
 
13
+ var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../utils/useIsomorphicLayoutEffect"));
14
+
13
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
16
 
15
17
  const PRIMER_PORTAL_ROOT_ID = '__primerPortalRoot__';
@@ -72,7 +74,7 @@ const Portal = ({
72
74
 
73
75
  const elementRef = _react.default.useRef(hostElement);
74
76
 
75
- _react.default.useLayoutEffect(() => {
77
+ (0, _useIsomorphicLayoutEffect.default)(() => {
76
78
  let containerName = _containerName;
77
79
 
78
80
  if (containerName === undefined) {
@@ -93,7 +95,6 @@ const Portal = ({
93
95
  parentElement.removeChild(element);
94
96
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
95
97
  }, [elementRef]);
96
-
97
98
  return /*#__PURE__*/(0, _reactDom.createPortal)(children, elementRef.current);
98
99
  };
99
100
 
@@ -39,13 +39,13 @@ const sizeVariants = (0, _styledSystem.variant)({
39
39
  const TextInputWrapper = _styledComponents.default.span.withConfig({
40
40
  displayName: "_TextInputWrapper__TextInputWrapper",
41
41
  componentId: "sc-5vfcis-0"
42
- })(["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:", ";}", " ", " ", " ", " ", ";"], (0, _constants.get)('fontSizes.1'), (0, _constants.get)('colors.fg.default'), (0, _constants.get)('colors.border.default'), (0, _constants.get)('radii.2'), (0, _constants.get)('shadows.primer.shadow.inset'), props => {
42
+ })(["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:", ";}", " ", " ", " ", " ", ";"], (0, _constants.get)('fontSizes.1'), (0, _constants.get)('colors.fg.default'), (0, _constants.get)('colors.border.default'), (0, _constants.get)('radii.2'), (0, _constants.get)('shadows.primer.shadow.inset'), props => {
43
43
  if (props.hasIcon) {
44
44
  return (0, _styledComponents.css)(["padding:0;"]);
45
45
  } else {
46
46
  return (0, _styledComponents.css)(["padding:6px 12px;"]);
47
47
  }
48
- }, (0, _constants.get)('colors.fg.muted'), (0, _constants.get)('space.2'), (0, _constants.get)('colors.accent.emphasis'), (0, _constants.get)('shadows.primer.shadow.focus'), props => props.contrast && (0, _styledComponents.css)(["background-color:", ";"], (0, _constants.get)('colors.canvas.inset')), props => props.disabled && (0, _styledComponents.css)(["color:", ";background-color:", ";border-color:", ";"], (0, _constants.get)('colors.primer.fg.disabled'), (0, _constants.get)('colors.input.disabledBg'), (0, _constants.get)('colors.border.default')), props => props.block && (0, _styledComponents.css)(["display:block;width:100%;"]), (0, _constants.get)('breakpoints.1'), (0, _constants.get)('fontSizes.1'), _styledSystem.width, _styledSystem.minWidth, _styledSystem.maxWidth, sizeVariants, _sx.default);
48
+ }, (0, _constants.get)('colors.fg.muted'), (0, _constants.get)('space.2'), (0, _constants.get)('colors.accent.emphasis'), (0, _constants.get)('shadows.primer.shadow.focus'), props => props.contrast && (0, _styledComponents.css)(["background-color:", ";"], (0, _constants.get)('colors.canvas.inset')), props => props.disabled && (0, _styledComponents.css)(["color:", ";background-color:", ";border-color:", ";"], (0, _constants.get)('colors.primer.fg.disabled'), (0, _constants.get)('colors.input.disabledBg'), (0, _constants.get)('colors.border.default')), props => props.block && (0, _styledComponents.css)(["display:block;width:100%;"]), props => props.block && props.hasIcon && (0, _styledComponents.css)(["display:flex;"]), (0, _constants.get)('breakpoints.1'), (0, _constants.get)('fontSizes.1'), _styledSystem.width, _styledSystem.minWidth, _styledSystem.maxWidth, sizeVariants, _sx.default);
49
49
 
50
50
  var _default = TextInputWrapper;
51
51
  exports.default = _default;
@@ -152,9 +152,11 @@ describe('AnchoredOverlay', () => {
152
152
  expect(mockCloseCallback).toHaveBeenCalledWith('escape');
153
153
  });
154
154
  it('should render consistently when open', () => {
155
- const anchoredOverlay = (0, _react2.render)( /*#__PURE__*/_react.default.createElement(AnchoredOverlayTestComponent, {
155
+ const {
156
+ container
157
+ } = (0, _react2.render)( /*#__PURE__*/_react.default.createElement(AnchoredOverlayTestComponent, {
156
158
  initiallyOpen: true
157
159
  }));
158
- expect(anchoredOverlay).toMatchSnapshot();
160
+ expect(container).toMatchSnapshot();
159
161
  });
160
162
  });
@@ -1,3 +1,4 @@
1
+ import { Union } from 'ts-toolbelt';
1
2
  import { KeyPaths } from '../utils/types/KeyPaths';
2
3
  declare type NestedObject = {
3
4
  a: string;
@@ -6,5 +7,5 @@ declare type NestedObject = {
6
7
  b2: string;
7
8
  };
8
9
  };
9
- export declare function generatesKeyPathsFromObject(x: KeyPaths<NestedObject>): 'a' | 'b.b1' | 'b.b2';
10
+ export declare function generatesKeyPathsFromObject(x: Union.Diff<KeyPaths<NestedObject>, 'a' | 'b.b1' | 'b.b2'>): never;
10
11
  export {};
@@ -58,16 +58,7 @@ const LabelledTextInputWithTokens = ({
58
58
  tokens: tokens,
59
59
  onTokenRemove: onTokenRemove,
60
60
  id: "tokenInput"
61
- }, rest))); // describe('axe test', () => {
62
- // it('should have no axe violations', async () => {
63
- // const onRemoveMock = jest.fn()
64
- // const {container} = HTMLRender(<LabelledTextInputWithTokens tokens={mockTokens} onTokenRemove={onRemoveMock} />)
65
- // const results = await axe(container)
66
- // expect(results).toHaveNoViolations()
67
- // cleanup()
68
- // })
69
- // })
70
-
61
+ }, rest)));
71
62
 
72
63
  jest.useFakeTimers();
73
64
  describe('TextInputWithTokens', () => {
@@ -13,6 +13,8 @@ var _useProvidedRefOrCreate = require("./useProvidedRefOrCreate");
13
13
 
14
14
  var _useResizeObserver = require("./useResizeObserver");
15
15
 
16
+ var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../utils/useIsomorphicLayoutEffect"));
17
+
16
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
19
 
18
20
  /**
@@ -39,8 +41,7 @@ function useAnchoredPosition(settings, dependencies = []) {
39
41
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
40
42
  [floatingElementRef, anchorElementRef, ...dependencies]);
41
43
 
42
- _react.default.useLayoutEffect(updatePosition, [updatePosition]);
43
-
44
+ (0, _useIsomorphicLayoutEffect.default)(updatePosition, [updatePosition]);
44
45
  (0, _useResizeObserver.useResizeObserver)(updatePosition);
45
46
  return {
46
47
  floatingElementRef,
@@ -1,4 +1,4 @@
1
- import React, { ForwardedRef } from 'react';
1
+ import { ForwardedRef } from 'react';
2
2
  /**
3
3
  * Creates a ref by combining multiple constituent refs. The ref returned by this hook
4
4
  * should be passed as the ref for the element that needs to be shared. This is
@@ -7,4 +7,4 @@ import React, { ForwardedRef } from 'react';
7
7
  * though, as it breaks encapsulation.
8
8
  * @param refs
9
9
  */
10
- export declare function useCombinedRefs<T>(...refs: (ForwardedRef<T> | null | undefined)[]): React.MutableRefObject<T | null>;
10
+ export declare function useCombinedRefs<T>(...refs: (ForwardedRef<T> | null | undefined)[]): import("react").MutableRefObject<T | null>;
@@ -5,11 +5,11 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useCombinedRefs = useCombinedRefs;
7
7
 
8
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = require("react");
9
9
 
10
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../utils/useIsomorphicLayoutEffect"));
11
11
 
12
- 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; }
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
14
14
  /**
15
15
  * Creates a ref by combining multiple constituent refs. The ref returned by this hook
@@ -21,8 +21,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
21
21
  */
22
22
  function useCombinedRefs(...refs) {
23
23
  const combinedRef = (0, _react.useRef)(null);
24
-
25
- _react.default.useLayoutEffect(() => {
24
+ (0, _useIsomorphicLayoutEffect.default)(() => {
26
25
  function setRefs(current = null) {
27
26
  for (const ref of refs) {
28
27
  if (!ref) {
@@ -44,6 +43,5 @@ function useCombinedRefs(...refs) {
44
43
  setRefs(combinedRef.current);
45
44
  }; // eslint-disable-next-line react-hooks/exhaustive-deps
46
45
  }, [...refs, combinedRef.current]);
47
-
48
46
  return combinedRef;
49
47
  }
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useResizeObserver = useResizeObserver;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../utils/useIsomorphicLayoutEffect"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
12
  function useResizeObserver(callback) {
13
- _react.default.useLayoutEffect(() => {
13
+ (0, _useIsomorphicLayoutEffect.default)(() => {
14
14
  const observer = new window.ResizeObserver(() => callback());
15
15
  observer.observe(document.documentElement);
16
16
  return () => {
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Password = exports.WithLeadingIcon = exports.Default = exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _ = require("..");
11
+
12
+ var _TextInput = _interopRequireDefault(require("../TextInput"));
13
+
14
+ var _octiconsReact = require("@primer/octicons-react");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+
20
+ 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; }
21
+
22
+ 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
+
24
+ var _default = {
25
+ title: 'Forms/Text Input',
26
+ component: _TextInput.default,
27
+ decorators: [Story => {
28
+ return /*#__PURE__*/_react.default.createElement(_.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_.BaseStyles, null, /*#__PURE__*/_react.default.createElement(_.Box, {
29
+ paddingTop: 5
30
+ }, Story())));
31
+ }],
32
+ argTypes: {
33
+ sx: {
34
+ table: {
35
+ disable: true
36
+ }
37
+ },
38
+ block: {
39
+ name: 'Block',
40
+ defaultValue: false,
41
+ control: {
42
+ type: 'boolean'
43
+ }
44
+ },
45
+ disabled: {
46
+ name: 'Disabled',
47
+ defaultValue: false,
48
+ control: {
49
+ type: 'boolean'
50
+ }
51
+ },
52
+ variant: {
53
+ name: 'Variants',
54
+ options: ['small', 'medium', 'large'],
55
+ control: {
56
+ type: 'radio'
57
+ }
58
+ }
59
+ }
60
+ };
61
+ exports.default = _default;
62
+
63
+ const Label = ({
64
+ htmlFor,
65
+ children
66
+ }) => /*#__PURE__*/_react.default.createElement(_.Text, {
67
+ as: "label",
68
+ htmlFor: htmlFor,
69
+ sx: {
70
+ fontWeight: 600,
71
+ fontSize: 14
72
+ }
73
+ }, children);
74
+
75
+ Label.displayName = "Label";
76
+
77
+ const Default = args => {
78
+ const [value, setValue] = (0, _react.useState)('');
79
+
80
+ const handleChange = event => {
81
+ setValue(event.target.value);
82
+ };
83
+
84
+ const inputId = 'basic-text-input';
85
+ return /*#__PURE__*/_react.default.createElement("form", null, /*#__PURE__*/_react.default.createElement("div", {
86
+ className: "form-group"
87
+ }, /*#__PURE__*/_react.default.createElement("div", {
88
+ className: "form-group-header"
89
+ }, /*#__PURE__*/_react.default.createElement(Label, {
90
+ htmlFor: inputId
91
+ }, "Example label")), /*#__PURE__*/_react.default.createElement("div", {
92
+ className: "form-group-body"
93
+ }, /*#__PURE__*/_react.default.createElement(_TextInput.default, _extends({
94
+ id: inputId,
95
+ value: value,
96
+ onChange: handleChange
97
+ }, args)))));
98
+ };
99
+
100
+ exports.Default = Default;
101
+ Default.displayName = "Default";
102
+
103
+ const WithLeadingIcon = args => {
104
+ const [value, setValue] = (0, _react.useState)('');
105
+
106
+ const handleChange = event => {
107
+ setValue(event.target.value);
108
+ };
109
+
110
+ const inputId = 'basic-text-input-with-leading-icon';
111
+ return /*#__PURE__*/_react.default.createElement("form", null, /*#__PURE__*/_react.default.createElement(Label, {
112
+ htmlFor: inputId
113
+ }, "Example label"), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement(_TextInput.default, _extends({
114
+ icon: _octiconsReact.CheckIcon,
115
+ id: inputId,
116
+ value: value,
117
+ onChange: handleChange,
118
+ type: "password"
119
+ }, args)));
120
+ };
121
+
122
+ exports.WithLeadingIcon = WithLeadingIcon;
123
+ WithLeadingIcon.displayName = "WithLeadingIcon";
124
+
125
+ const Password = args => {
126
+ const [value, setValue] = (0, _react.useState)('');
127
+
128
+ const handleChange = event => {
129
+ setValue(event.target.value);
130
+ };
131
+
132
+ const inputId = 'basic-text-input-as-password';
133
+ return /*#__PURE__*/_react.default.createElement("form", null, /*#__PURE__*/_react.default.createElement(Label, {
134
+ htmlFor: inputId
135
+ }, "Password"), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement(_TextInput.default, _extends({
136
+ type: "password",
137
+ id: inputId,
138
+ value: value,
139
+ onChange: handleChange
140
+ }, args)));
141
+ };
142
+
143
+ exports.Password = Password;
144
+ Password.displayName = "Password";
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WithOnRemoveFn = exports.Interactive = exports.DefaultToken = exports.default = void 0;
6
+ exports.WithOnRemoveFn = exports.WithLeadingVisual = exports.Interactive = exports.DefaultToken = exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
@@ -19,6 +19,8 @@ var _Token = _interopRequireDefault(require("../Token/Token"));
19
19
 
20
20
  var _Text = _interopRequireDefault(require("../Text"));
21
21
 
22
+ var _octiconsReact = require("@primer/octicons-react");
23
+
22
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
25
 
24
26
  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); }
@@ -36,7 +38,7 @@ var _default = {
36
38
  }]
37
39
  };
38
40
  exports.default = _default;
39
- const excludedControlKeys = ['id', 'as', 'tabIndex', 'onRemove'];
41
+ const excludedControlKeys = ['id', 'as', 'tabIndex', 'onRemove', 'leadingVisual'];
40
42
 
41
43
  const SingleExampleContainer = ({
42
44
  children,
@@ -115,6 +117,21 @@ Interactive.parameters = {
115
117
  }
116
118
  };
117
119
 
120
+ const WithLeadingVisual = args => {
121
+ return /*#__PURE__*/_react.default.createElement(ExampleCollectionContainer, null, /*#__PURE__*/_react.default.createElement(_Token.default, _extends({}, args, {
122
+ leadingVisual: () => /*#__PURE__*/_react.default.createElement(_octiconsReact.GitBranchIcon, null)
123
+ })));
124
+ };
125
+
126
+ exports.WithLeadingVisual = WithLeadingVisual;
127
+ WithLeadingVisual.displayName = "WithLeadingVisual";
128
+ WithLeadingVisual.storyName = 'with leadingVisual';
129
+ WithLeadingVisual.parameters = {
130
+ controls: {
131
+ exclude: [...excludedControlKeys, 'hideRemoveButton']
132
+ }
133
+ };
134
+
118
135
  const WithOnRemoveFn = args => {
119
136
  return /*#__PURE__*/_react.default.createElement(ExampleCollectionContainer, null, /*#__PURE__*/_react.default.createElement(SingleExampleContainer, {
120
137
  label: "w/ onRemove passed"
@@ -1,3 +1,3 @@
1
1
  export declare type KeyPaths<O extends Record<string, unknown>> = {
2
- [K in keyof O]: K extends string ? (O[K] extends string ? `${K}` : `${K}.${KeyPaths<O[K]>}`) : never;
2
+ [K in keyof O]: K extends string ? O[K] extends string ? `${K}` : `${K}.${KeyPaths<O[K]>}` : never;
3
3
  }[keyof O];
@@ -0,0 +1,3 @@
1
+ import { useEffect } from 'react';
2
+ declare const useIsomorphicLayoutEffect: typeof useEffect;
3
+ export default useIsomorphicLayoutEffect;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? _react.useLayoutEffect : _react.useEffect;
11
+ var _default = useIsomorphicLayoutEffect;
12
+ exports.default = _default;
@@ -28,6 +28,6 @@ export function Header({
28
28
  return /*#__PURE__*/React.createElement(StyledHeader, _extends({
29
29
  role: "heading",
30
30
  variant: variant
31
- }, props), title, auxiliaryText && /*#__PURE__*/React.createElement("span", null, "auxiliaryText"));
31
+ }, props), title, auxiliaryText && /*#__PURE__*/React.createElement("span", null, auxiliaryText));
32
32
  }
33
33
  Header.displayName = "Header";
@@ -1,8 +1,9 @@
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
3
  import styled from 'styled-components';
4
- import React, { useEffect, useLayoutEffect, useRef } from 'react';
4
+ import React, { useEffect, useRef } from 'react';
5
5
  import { get, COMMON } from './constants';
6
+ import useLayoutEffect from './utils/useIsomorphicLayoutEffect';
6
7
  import { useOverlay } from './hooks';
7
8
  import Portal from './Portal';
8
9
  import sx from './sx';
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { createPortal } from 'react-dom';
3
+ import useLayoutEffect from '../utils/useIsomorphicLayoutEffect';
3
4
  const PRIMER_PORTAL_ROOT_ID = '__primerPortalRoot__';
4
5
  const DEFAULT_PORTAL_CONTAINER_NAME = '__default__';
5
6
  const portalRootRegistry = {};
@@ -57,7 +58,7 @@ export const Portal = ({
57
58
  hostElement.style.position = 'relative';
58
59
  hostElement.style.zIndex = '1';
59
60
  const elementRef = React.useRef(hostElement);
60
- React.useLayoutEffect(() => {
61
+ useLayoutEffect(() => {
61
62
  let containerName = _containerName;
62
63
 
63
64
  if (containerName === undefined) {
@@ -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;
@@ -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
  });
@@ -1,3 +1,4 @@
1
+ import { Union } from 'ts-toolbelt';
1
2
  import { KeyPaths } from '../utils/types/KeyPaths';
2
3
  declare type NestedObject = {
3
4
  a: string;
@@ -6,5 +7,5 @@ declare type NestedObject = {
6
7
  b2: string;
7
8
  };
8
9
  };
9
- export declare function generatesKeyPathsFromObject(x: KeyPaths<NestedObject>): 'a' | 'b.b1' | 'b.b2';
10
+ export declare function generatesKeyPathsFromObject(x: Union.Diff<KeyPaths<NestedObject>, 'a' | 'b.b1' | 'b.b2'>): never;
10
11
  export {};
@@ -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', () => {
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { getAnchoredPosition } from '../behaviors/anchoredPosition';
3
3
  import { useProvidedRefOrCreate } from './useProvidedRefOrCreate';
4
4
  import { useResizeObserver } from './useResizeObserver';
5
+ import useLayoutEffect from '../utils/useIsomorphicLayoutEffect';
5
6
 
6
7
  /**
7
8
  * Calculates the top and left values for an absolutely-positioned floating element
@@ -24,7 +25,7 @@ export function useAnchoredPosition(settings, dependencies = []) {
24
25
  }
25
26
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
26
27
  [floatingElementRef, anchorElementRef, ...dependencies]);
27
- React.useLayoutEffect(updatePosition, [updatePosition]);
28
+ useLayoutEffect(updatePosition, [updatePosition]);
28
29
  useResizeObserver(updatePosition);
29
30
  return {
30
31
  floatingElementRef,
@@ -1,4 +1,4 @@
1
- import React, { ForwardedRef } from 'react';
1
+ import { ForwardedRef } from 'react';
2
2
  /**
3
3
  * Creates a ref by combining multiple constituent refs. The ref returned by this hook
4
4
  * should be passed as the ref for the element that needs to be shared. This is
@@ -7,4 +7,4 @@ import React, { ForwardedRef } from 'react';
7
7
  * though, as it breaks encapsulation.
8
8
  * @param refs
9
9
  */
10
- export declare function useCombinedRefs<T>(...refs: (ForwardedRef<T> | null | undefined)[]): React.MutableRefObject<T | null>;
10
+ export declare function useCombinedRefs<T>(...refs: (ForwardedRef<T> | null | undefined)[]): import("react").MutableRefObject<T | null>;