@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.
- package/CHANGELOG.md +8 -0
- package/dist/browser.esm.js +180 -178
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +182 -180
- package/dist/browser.umd.js.map +1 -1
- package/docs/content/FilterList.md +2 -2
- package/docs/content/theming.md +23 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +1 -3
- package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +1 -1
- package/lib/ActionList/Header.js +1 -1
- package/lib/Overlay.js +3 -1
- package/lib/Portal/Portal.js +3 -2
- package/lib/_TextInputWrapper.js +2 -2
- package/lib/__tests__/AnchoredOverlay.test.js +4 -2
- package/lib/__tests__/KeyPaths.types.test.d.ts +2 -1
- package/lib/__tests__/TextInputWithTokens.test.js +1 -10
- package/lib/hooks/useAnchoredPosition.js +3 -2
- package/lib/hooks/useCombinedRefs.d.ts +2 -2
- package/lib/hooks/useCombinedRefs.js +4 -6
- package/lib/hooks/useResizeObserver.js +2 -2
- package/lib/stories/TextInput.stories.js +144 -0
- package/lib/stories/Token.stories.js +19 -2
- package/lib/utils/types/KeyPaths.d.ts +1 -1
- package/lib/utils/useIsomorphicLayoutEffect.d.ts +3 -0
- package/lib/utils/useIsomorphicLayoutEffect.js +12 -0
- package/lib-esm/ActionList/Header.js +1 -1
- package/lib-esm/Overlay.js +2 -1
- package/lib-esm/Portal/Portal.js +2 -1
- package/lib-esm/_TextInputWrapper.js +2 -2
- package/lib-esm/__tests__/AnchoredOverlay.test.js +4 -2
- package/lib-esm/__tests__/KeyPaths.types.test.d.ts +2 -1
- package/lib-esm/__tests__/TextInputWithTokens.test.js +1 -10
- package/lib-esm/hooks/useAnchoredPosition.js +2 -1
- package/lib-esm/hooks/useCombinedRefs.d.ts +2 -2
- package/lib-esm/hooks/useCombinedRefs.js +3 -2
- package/lib-esm/hooks/useResizeObserver.js +2 -2
- package/lib-esm/stories/TextInput.stories.js +117 -0
- package/lib-esm/stories/Token.stories.js +14 -1
- package/lib-esm/utils/types/KeyPaths.d.ts +1 -1
- package/lib-esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
- package/lib-esm/utils/useIsomorphicLayoutEffect.js +3 -0
- package/migrating.md +1 -1
- package/package-lock.json +15 -2
- package/package.json +3 -2
- package/script/build +2 -0
- package/src/ActionList/Header.tsx +1 -1
- package/src/Overlay.tsx +2 -1
- package/src/Portal/Portal.tsx +2 -1
- package/src/_TextInputWrapper.tsx +7 -0
- package/src/__tests__/AnchoredOverlay.test.tsx +2 -2
- package/src/__tests__/KeyPaths.types.test.ts +2 -1
- package/src/__tests__/TextInputWithTokens.test.tsx +0 -10
- package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +35 -135
- package/src/hooks/useAnchoredPosition.ts +2 -1
- package/src/hooks/useCombinedRefs.ts +3 -3
- package/src/hooks/useResizeObserver.ts +2 -2
- package/src/stories/Button.stories.tsx +1 -1
- package/src/stories/TextInput.stories.tsx +113 -0
- package/src/stories/Token.stories.tsx +12 -1
- package/src/utils/types/KeyPaths.ts +7 -1
- package/src/utils/useIsomorphicLayoutEffect.ts +10 -0
- 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=
|
11
|
+
<FilterList.Item selected count={32} href="#foo">
|
12
12
|
First Filter
|
13
13
|
</FilterList.Item>
|
14
|
-
<FilterList.Item count=
|
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>
|
package/docs/content/theming.md
CHANGED
@@ -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
|
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>
|
package/lib/ActionList/Header.js
CHANGED
@@ -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,
|
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,
|
144
|
+
(0, _useIsomorphicLayoutEffect.default)(() => {
|
143
145
|
var _overlayRef$current;
|
144
146
|
|
145
147
|
const {
|
package/lib/Portal/Portal.js
CHANGED
@@ -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
|
-
|
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
|
|
package/lib/_TextInputWrapper.js
CHANGED
@@ -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
|
155
|
+
const {
|
156
|
+
container
|
157
|
+
} = (0, _react2.render)( /*#__PURE__*/_react.default.createElement(AnchoredOverlayTestComponent, {
|
156
158
|
initiallyOpen: true
|
157
159
|
}));
|
158
|
-
expect(
|
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
|
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)));
|
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
|
-
|
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
|
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)[]):
|
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 =
|
8
|
+
var _react = require("react");
|
9
9
|
|
10
|
-
|
10
|
+
var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../utils/useIsomorphicLayoutEffect"));
|
11
11
|
|
12
|
-
function
|
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
|
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
|
-
|
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 ?
|
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,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,
|
31
|
+
}, props), title, auxiliaryText && /*#__PURE__*/React.createElement("span", null, auxiliaryText));
|
32
32
|
}
|
33
33
|
Header.displayName = "Header";
|
package/lib-esm/Overlay.js
CHANGED
@@ -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,
|
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';
|
package/lib-esm/Portal/Portal.js
CHANGED
@@ -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
|
-
|
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
|
129
|
+
const {
|
130
|
+
container
|
131
|
+
} = HTMLRender( /*#__PURE__*/React.createElement(AnchoredOverlayTestComponent, {
|
130
132
|
initiallyOpen: true
|
131
133
|
}));
|
132
|
-
expect(
|
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
|
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)));
|
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
|
-
|
28
|
+
useLayoutEffect(updatePosition, [updatePosition]);
|
28
29
|
useResizeObserver(updatePosition);
|
29
30
|
return {
|
30
31
|
floatingElementRef,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
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)[]):
|
10
|
+
export declare function useCombinedRefs<T>(...refs: (ForwardedRef<T> | null | undefined)[]): import("react").MutableRefObject<T | null>;
|