@primer/components 0.0.0-202192719508 → 0.0.0-2021927202224

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 (74) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/dist/browser.esm.js +54 -53
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +51 -50
  5. package/dist/browser.umd.js.map +1 -1
  6. package/lib/ActionList/Item.d.ts +6 -0
  7. package/lib/ActionList/Item.js +5 -1
  8. package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +2 -4
  9. package/lib/Autocomplete/Autocomplete.d.ts +2 -4
  10. package/lib/Autocomplete/AutocompleteInput.d.ts +2 -4
  11. package/lib/Breadcrumbs.d.ts +8 -7
  12. package/lib/Breadcrumbs.js +7 -12
  13. package/lib/SelectMenu/SelectMenu.d.ts +2 -4
  14. package/lib/TextInputWithTokens.d.ts +6 -4
  15. package/lib/TextInputWithTokens.js +102 -29
  16. package/lib/Token/Token.js +13 -2
  17. package/lib/Token/TokenBase.js +0 -4
  18. package/lib/Token/_RemoveTokenButton.js +15 -2
  19. package/lib/_TextInputWrapper.js +1 -1
  20. package/lib/theme-preval.js +2 -2
  21. package/lib/utils/testing.d.ts +1 -1
  22. package/lib-esm/ActionList/Item.d.ts +6 -0
  23. package/lib-esm/ActionList/Item.js +5 -1
  24. package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +2 -4
  25. package/lib-esm/Autocomplete/Autocomplete.d.ts +2 -4
  26. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +2 -4
  27. package/lib-esm/Breadcrumbs.d.ts +8 -7
  28. package/lib-esm/Breadcrumbs.js +8 -13
  29. package/lib-esm/SelectMenu/SelectMenu.d.ts +2 -4
  30. package/lib-esm/TextInputWithTokens.d.ts +6 -4
  31. package/lib-esm/TextInputWithTokens.js +101 -30
  32. package/lib-esm/Token/Token.js +13 -2
  33. package/lib-esm/Token/TokenBase.js +0 -4
  34. package/lib-esm/Token/_RemoveTokenButton.js +11 -2
  35. package/lib-esm/_TextInputWrapper.js +1 -1
  36. package/lib-esm/theme-preval.js +2 -2
  37. package/lib-esm/utils/testing.d.ts +1 -1
  38. package/package.json +13 -14
  39. package/lib/DatePicker/DatePicker.d.ts +0 -48
  40. package/lib/DatePicker/DatePicker.js +0 -104
  41. package/lib/DatePicker/DatePickerAnchor.d.ts +0 -5
  42. package/lib/DatePicker/DatePickerAnchor.js +0 -182
  43. package/lib/DatePicker/DatePickerOverlay.d.ts +0 -3
  44. package/lib/DatePicker/DatePickerOverlay.js +0 -48
  45. package/lib/DatePicker/DatePickerPanel.d.ts +0 -2
  46. package/lib/DatePicker/DatePickerPanel.js +0 -126
  47. package/lib/DatePicker/Day.d.ts +0 -14
  48. package/lib/DatePicker/Day.js +0 -190
  49. package/lib/DatePicker/Month.d.ts +0 -9
  50. package/lib/DatePicker/Month.js +0 -120
  51. package/lib/DatePicker/index.d.ts +0 -2
  52. package/lib/DatePicker/index.js +0 -13
  53. package/lib/DatePicker/useDatePicker.d.ts +0 -88
  54. package/lib/DatePicker/useDatePicker.js +0 -421
  55. package/lib/hooks/useDebounce.d.ts +0 -2
  56. package/lib/hooks/useDebounce.js +0 -24
  57. package/lib-esm/DatePicker/DatePicker.d.ts +0 -48
  58. package/lib-esm/DatePicker/DatePicker.js +0 -87
  59. package/lib-esm/DatePicker/DatePickerAnchor.d.ts +0 -5
  60. package/lib-esm/DatePicker/DatePickerAnchor.js +0 -155
  61. package/lib-esm/DatePicker/DatePickerOverlay.d.ts +0 -3
  62. package/lib-esm/DatePicker/DatePickerOverlay.js +0 -29
  63. package/lib-esm/DatePicker/DatePickerPanel.d.ts +0 -2
  64. package/lib-esm/DatePicker/DatePickerPanel.js +0 -100
  65. package/lib-esm/DatePicker/Day.d.ts +0 -14
  66. package/lib-esm/DatePicker/Day.js +0 -167
  67. package/lib-esm/DatePicker/Month.d.ts +0 -9
  68. package/lib-esm/DatePicker/Month.js +0 -96
  69. package/lib-esm/DatePicker/index.d.ts +0 -2
  70. package/lib-esm/DatePicker/index.js +0 -1
  71. package/lib-esm/DatePicker/useDatePicker.d.ts +0 -88
  72. package/lib-esm/DatePicker/useDatePicker.js +0 -391
  73. package/lib-esm/hooks/useDebounce.d.ts +0 -2
  74. package/lib-esm/hooks/useDebounce.js +0 -16
@@ -28,13 +28,19 @@ export interface ItemProps extends SxProp {
28
28
  */
29
29
  leadingVisual?: React.FunctionComponent<IconProps>;
30
30
  /**
31
+ * @deprecated Use `trailingVisual` instead
31
32
  * Icon (or similar) positioned after `Item` text.
32
33
  */
33
34
  trailingIcon?: React.FunctionComponent<IconProps>;
34
35
  /**
36
+ * @deprecated Use `trailingVisual` instead
35
37
  * Text positioned after `Item` text and optional trailing icon.
36
38
  */
37
39
  trailingText?: string;
40
+ /**
41
+ * Icon or text positioned after `Item` text.
42
+ */
43
+ trailingVisual?: React.ReactNode;
38
44
  /**
39
45
  * Style variations associated with various `Item` types.
40
46
  *
@@ -187,6 +187,7 @@ const Item = /*#__PURE__*/_react.default.forwardRef((itemProps, ref) => {
187
187
  selectionVariant,
188
188
  leadingVisual: LeadingVisual,
189
189
  trailingIcon: TrailingIcon,
190
+ trailingVisual: TrailingVisual,
190
191
  trailingText,
191
192
  variant = 'default',
192
193
  showDivider,
@@ -278,7 +279,10 @@ const Item = /*#__PURE__*/_react.default.forwardRef((itemProps, ref) => {
278
279
  title: description,
279
280
  inline: true,
280
281
  maxWidth: "100%"
281
- }, description)) : null), TrailingIcon || trailingText ? /*#__PURE__*/_react.default.createElement(TrailingContent, {
282
+ }, description)) : null), TrailingVisual ? /*#__PURE__*/_react.default.createElement(TrailingContent, {
283
+ variant: variant,
284
+ disabled: disabled
285
+ }, typeof TrailingVisual === 'function' ? /*#__PURE__*/_react.default.createElement(TrailingVisual, null) : TrailingVisual) : TrailingIcon || trailingText ? /*#__PURE__*/_react.default.createElement(TrailingContent, {
282
286
  variant: variant,
283
287
  disabled: disabled
284
288
  }, trailingText, TrailingIcon && /*#__PURE__*/_react.default.createElement(TrailingIcon, null)) : null));
@@ -26,8 +26,6 @@ interface AnchoredOverlayPropsWithoutAnchor {
26
26
  */
27
27
  anchorRef: React.RefObject<HTMLElement>;
28
28
  }
29
- export declare type OverlayOpenGesture = 'anchor-click' | 'anchor-key-press';
30
- export declare type OverlayCloseGesture = 'anchor-click' | 'click-outside' | 'escape';
31
29
  export declare type AnchoredOverlayWrapperAnchorProps = Partial<AnchoredOverlayPropsWithAnchor> | AnchoredOverlayPropsWithoutAnchor;
32
30
  interface AnchoredOverlayBaseProps extends Pick<OverlayProps, 'height' | 'width'> {
33
31
  /**
@@ -37,11 +35,11 @@ interface AnchoredOverlayBaseProps extends Pick<OverlayProps, 'height' | 'width'
37
35
  /**
38
36
  * A callback which is called whenever the overlay is currently closed and an "open gesture" is detected.
39
37
  */
40
- onOpen?: (gesture: OverlayOpenGesture) => unknown;
38
+ onOpen?: (gesture: 'anchor-click' | 'anchor-key-press') => unknown;
41
39
  /**
42
40
  * A callback which is called whenever the overlay is currently open and a "close gesture" is detected.
43
41
  */
44
- onClose?: (gesture: OverlayCloseGesture) => unknown;
42
+ onClose?: (gesture: 'anchor-click' | 'click-outside' | 'escape') => unknown;
45
43
  /**
46
44
  * Props to be spread on the internal `Overlay` component.
47
45
  */
@@ -12,14 +12,12 @@ export type { AutocompleteOverlayProps } from './AutocompleteOverlay';
12
12
  declare const _default: React.FC<{
13
13
  id?: string | undefined;
14
14
  }> & {
15
- Input: import("@radix-ui/react-polymorphic").ForwardRefComponent<React.ForwardRefExoticComponent<Pick<Omit<Pick<({
15
+ Input: import("@radix-ui/react-polymorphic").ForwardRefComponent<React.ForwardRefExoticComponent<Pick<Omit<Pick<{
16
16
  [x: string]: any;
17
17
  [x: number]: any;
18
18
  } & {
19
19
  theme?: any;
20
- } & ({} | {
21
- children?: React.ReactNode;
22
- })) & {
20
+ } & {
23
21
  as?: string | React.ComponentType<any> | undefined;
24
22
  forwardedAs?: string | React.ComponentType<any> | undefined;
25
23
  }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "className" | "block" | "icon" | "sx" | "disabled" | "variant" | "contrast"> & {
@@ -4,14 +4,12 @@ import { ComponentProps } from '../utils/types';
4
4
  declare type InternalAutocompleteInputProps = {
5
5
  as?: React.ComponentType<any>;
6
6
  };
7
- declare const AutocompleteInput: PolymorphicForwardRefComponent<React.ForwardRefExoticComponent<Pick<Omit<Pick<({
7
+ declare const AutocompleteInput: PolymorphicForwardRefComponent<React.ForwardRefExoticComponent<Pick<Omit<Pick<{
8
8
  [x: string]: any;
9
9
  [x: number]: any;
10
10
  } & {
11
11
  theme?: any;
12
- } & ({} | {
13
- children?: React.ReactNode;
14
- })) & {
12
+ } & {
15
13
  as?: string | React.ComponentType<any> | undefined;
16
14
  forwardedAs?: string | React.ComponentType<any> | undefined;
17
15
  }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "className" | "block" | "icon" | "sx" | "disabled" | "variant" | "contrast"> & {
@@ -1,24 +1,25 @@
1
1
  import * as History from 'history';
2
2
  import React from 'react';
3
- import { SystemCommonProps, SystemFlexProps } from './constants';
4
3
  import { SxProp } from './sx';
5
4
  import { ComponentProps } from './utils/types';
6
- declare const BreadcrumbsBase: import("styled-components").StyledComponent<"nav", any, SystemFlexProps & SystemCommonProps & SxProp, never>;
7
- export declare type BreadcrumbsProps = ComponentProps<typeof BreadcrumbsBase>;
8
- declare function Breadcrumbs({ className, children, theme, ...rest }: React.PropsWithChildren<BreadcrumbsProps>): JSX.Element;
5
+ declare const BreadcrumbsBase: import("styled-components").StyledComponent<"nav", any, SxProp, never>;
6
+ export declare type BreadcrumbsProps = React.PropsWithChildren<{
7
+ className?: string;
8
+ } & SxProp>;
9
+ declare function Breadcrumbs({ className, children, sx: sxProp }: React.PropsWithChildren<BreadcrumbsProps>): JSX.Element;
9
10
  declare namespace Breadcrumbs {
10
11
  var displayName: string;
11
12
  }
12
13
  declare const BreadcrumbsItem: import("styled-components").StyledComponent<"a", any, {
13
14
  to?: History.LocationDescriptor<unknown> | undefined;
14
15
  selected?: boolean | undefined;
15
- } & SystemCommonProps & SxProp, never>;
16
+ } & SxProp, never>;
16
17
  export declare type BreadcrumbsItemProps = ComponentProps<typeof BreadcrumbsItem>;
17
18
  declare const _default: typeof Breadcrumbs & {
18
19
  Item: import("styled-components").StyledComponent<"a", any, {
19
20
  to?: History.LocationDescriptor<unknown> | undefined;
20
21
  selected?: boolean | undefined;
21
- } & SystemCommonProps & SxProp, never>;
22
+ } & SxProp, never>;
22
23
  };
23
24
  export default _default;
24
25
  /**
@@ -28,7 +29,7 @@ export declare const Breadcrumb: typeof Breadcrumbs & {
28
29
  Item: import("styled-components").StyledComponent<"a", any, {
29
30
  to?: History.LocationDescriptor<unknown> | undefined;
30
31
  selected?: boolean | undefined;
31
- } & SystemCommonProps & SxProp, never>;
32
+ } & SxProp, never>;
32
33
  };
33
34
  /**
34
35
  * @deprecated Use the `BreadcrumbsProps` type instead
@@ -19,8 +19,6 @@ var _sx = _interopRequireDefault(require("./sx"));
19
19
 
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
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
22
  const SELECTED_CLASS = 'selected';
25
23
 
26
24
  const Wrapper = _styledComponents.default.li.withConfig({
@@ -31,23 +29,20 @@ const Wrapper = _styledComponents.default.li.withConfig({
31
29
  const BreadcrumbsBase = _styledComponents.default.nav.withConfig({
32
30
  displayName: "Breadcrumbs__BreadcrumbsBase",
33
31
  componentId: "hwwoo0-1"
34
- })(["display:flex;justify-content:space-between;", ";", ";", ";"], _constants.COMMON, _constants.FLEX, _sx.default);
32
+ })(["display:flex;justify-content:space-between;", ";"], _sx.default);
35
33
 
36
34
  function Breadcrumbs({
37
35
  className,
38
36
  children,
39
- theme,
40
- ...rest
37
+ sx: sxProp
41
38
  }) {
42
- const wrappedChildren = _react.default.Children.map(children, child => /*#__PURE__*/_react.default.createElement(Wrapper, {
43
- theme: theme
44
- }, child));
39
+ const wrappedChildren = _react.default.Children.map(children, child => /*#__PURE__*/_react.default.createElement(Wrapper, null, child));
45
40
 
46
- return /*#__PURE__*/_react.default.createElement(BreadcrumbsBase, _extends({
41
+ return /*#__PURE__*/_react.default.createElement(BreadcrumbsBase, {
47
42
  className: className,
48
43
  "aria-label": "Breadcrumbs",
49
- theme: theme
50
- }, rest), /*#__PURE__*/_react.default.createElement(_Box.default, {
44
+ sx: sxProp
45
+ }, /*#__PURE__*/_react.default.createElement(_Box.default, {
51
46
  as: "ol",
52
47
  my: 0,
53
48
  pl: 0
@@ -63,7 +58,7 @@ const BreadcrumbsItem = _styledComponents.default.a.attrs(props => ({
63
58
  })).withConfig({
64
59
  displayName: "Breadcrumbs__BreadcrumbsItem",
65
60
  componentId: "hwwoo0-2"
66
- })(["color:", ";display:inline-block;font-size:", ";text-decoration:none;&:hover{text-decoration:underline;}&.selected{color:", ";pointer-events:none;}", " ", ";"], (0, _constants.get)('colors.accent.fg'), (0, _constants.get)('fontSizes.1'), (0, _constants.get)('colors.fg.default'), _constants.COMMON, _sx.default);
61
+ })(["color:", ";display:inline-block;font-size:", ";text-decoration:none;&:hover{text-decoration:underline;}&.selected{color:", ";pointer-events:none;}", ";"], (0, _constants.get)('colors.accent.fg'), (0, _constants.get)('fontSizes.1'), (0, _constants.get)('colors.fg.default'), _sx.default);
67
62
 
68
63
  Breadcrumbs.displayName = 'Breadcrumbs';
69
64
  BreadcrumbsItem.displayName = 'Breadcrumbs.Item';
@@ -32,14 +32,12 @@ declare const _default: React.ForwardRefExoticComponent<Pick<SelectMenuInternalP
32
32
  Divider: import("styled-components").StyledComponent<"div", any, SystemCommonProps & SxProp, never>;
33
33
  Filter: React.ForwardRefExoticComponent<Pick<{
34
34
  value?: string | undefined;
35
- } & Pick<Omit<Pick<({
35
+ } & Pick<Omit<Pick<{
36
36
  [x: string]: any;
37
37
  [x: number]: any;
38
38
  } & {
39
39
  theme?: any;
40
- } & ({} | {
41
- children?: React.ReactNode;
42
- })) & {
40
+ } & {
43
41
  as?: string | React.ComponentType<any> | undefined;
44
42
  forwardedAs?: string | React.ComponentType<any> | undefined;
45
43
  }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "className" | "block" | "icon" | "sx" | "disabled" | "variant" | "contrast"> & {
@@ -32,14 +32,16 @@ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<{
32
32
  * Whether the remove buttons should be rendered in the tokens
33
33
  */
34
34
  hideTokenRemoveButtons?: boolean | undefined;
35
- } & Pick<Omit<Pick<({
35
+ /**
36
+ * The number of tokens to display before truncating
37
+ */
38
+ visibleTokenCount?: number | undefined;
39
+ } & Pick<Omit<Pick<{
36
40
  [x: string]: any;
37
41
  [x: number]: any;
38
42
  } & {
39
43
  theme?: any;
40
- } & ({} | {
41
- children?: React.ReactNode;
42
- })) & {
44
+ } & {
43
45
  as?: string | React.ComponentType<any> | undefined;
44
46
  forwardedAs?: string | React.ComponentType<any> | undefined;
45
47
  }, string | number | symbol>, "maxWidth" | "minWidth" | "width" | "theme" | "className" | "block" | "icon" | "sx" | "disabled" | "variant" | "contrast"> & {
@@ -25,6 +25,10 @@ var _TextInputWrapper = _interopRequireDefault(require("./_TextInputWrapper"));
25
25
 
26
26
  var _Box = _interopRequireDefault(require("./Box"));
27
27
 
28
+ var _Text = _interopRequireDefault(require("./Text"));
29
+
30
+ var _iterateFocusableElements = require("./utils/iterateFocusableElements");
31
+
28
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
33
 
30
34
  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); }
@@ -33,7 +37,13 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
33
37
 
34
38
  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); }
35
39
 
36
- // using forwardRef is important so that other components (ex. Autocomplete) can use the ref
40
+ const overflowCountFontSizeMap = {
41
+ small: 0,
42
+ medium: 1,
43
+ large: 1,
44
+ extralarge: 2
45
+ }; // using forwardRef is important so that other components (ex. Autocomplete) can use the ref
46
+
37
47
  function TextInputWithTokensInnerComponent({
38
48
  icon: IconComponent,
39
49
  contrast,
@@ -53,9 +63,11 @@ function TextInputWithTokensInnerComponent({
53
63
  minWidth: minWidthProp,
54
64
  maxWidth: maxWidthProp,
55
65
  variant: variantProp,
66
+ visibleTokenCount,
56
67
  ...rest
57
68
  }, externalRef) {
58
69
  const {
70
+ onBlur,
59
71
  onFocus,
60
72
  onKeyDown,
61
73
  ...inputPropsRest
@@ -64,6 +76,7 @@ function TextInputWithTokensInnerComponent({
64
76
  const localInputRef = (0, _react.useRef)(null);
65
77
  const combinedInputRef = (0, _useCombinedRefs.useCombinedRefs)(localInputRef, ref);
66
78
  const [selectedTokenIndex, setSelectedTokenIndex] = (0, _react.useState)();
79
+ const [tokensAreTruncated, setTokensAreTruncated] = (0, _react.useState)(Boolean(visibleTokenCount));
67
80
  const {
68
81
  containerRef
69
82
  } = (0, _useFocusZone.useFocusZone)({
@@ -98,14 +111,25 @@ function TextInputWithTokensInnerComponent({
98
111
  }, [selectedTokenIndex]);
99
112
 
100
113
  const handleTokenRemove = tokenId => {
101
- onTokenRemove(tokenId);
114
+ onTokenRemove(tokenId); // HACK: wait a tick for the the token node to be removed from the DOM
102
115
 
103
- if (selectedTokenIndex) {
104
- var _containerRef$current2;
116
+ setTimeout(() => {
117
+ var _containerRef$current2, _containerRef$current3;
105
118
 
106
- const nextElementToFocus = (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.children[selectedTokenIndex];
107
- nextElementToFocus.focus();
108
- }
119
+ const nextElementToFocus = (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.children[selectedTokenIndex || 0]; // when removing the first token by keying "Backspace" or "Delete",
120
+ // `nextFocusableElement` is the div that wraps the input
121
+
122
+ const firstFocusable = nextElementToFocus && (0, _iterateFocusableElements.isFocusable)(nextElementToFocus) ? nextElementToFocus : Array.from(((_containerRef$current3 = containerRef.current) === null || _containerRef$current3 === void 0 ? void 0 : _containerRef$current3.children) || []).find(el => (0, _iterateFocusableElements.isFocusable)(el));
123
+
124
+ if (firstFocusable) {
125
+ firstFocusable.focus();
126
+ } else {
127
+ var _ref$current;
128
+
129
+ // if there are no tokens left, focus the input
130
+ (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
131
+ }
132
+ }, 0);
109
133
  };
110
134
 
111
135
  const handleTokenFocus = tokenIndex => () => {
@@ -113,30 +137,55 @@ function TextInputWithTokensInnerComponent({
113
137
  };
114
138
 
115
139
  const handleTokenBlur = () => {
116
- setSelectedTokenIndex(undefined);
140
+ setSelectedTokenIndex(undefined); // HACK: wait a tick and check the focused element before hiding truncated tokens
141
+ // this prevents the tokens from hiding when the user is moving focus between tokens,
142
+ // but still hides the tokens when the user blurs the token by tabbing out or clicking somewhere else on the page
143
+
144
+ setTimeout(() => {
145
+ var _containerRef$current4;
146
+
147
+ if (!((_containerRef$current4 = containerRef.current) !== null && _containerRef$current4 !== void 0 && _containerRef$current4.contains(document.activeElement)) && visibleTokenCount) {
148
+ setTokensAreTruncated(true);
149
+ }
150
+ }, 0);
117
151
  };
118
152
 
119
- const handleTokenKeyUp = e => {
120
- if (e.key === 'Escape') {
121
- var _ref$current;
153
+ const handleTokenKeyUp = event => {
154
+ if (event.key === 'Escape') {
155
+ var _ref$current2;
122
156
 
123
- (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
157
+ (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.focus();
124
158
  }
125
159
  };
126
160
 
127
- const handleInputFocus = e => {
128
- onFocus && onFocus(e);
161
+ const handleInputFocus = event => {
162
+ onFocus && onFocus(event);
129
163
  setSelectedTokenIndex(undefined);
164
+ visibleTokenCount && setTokensAreTruncated(false);
165
+ };
166
+
167
+ const handleInputBlur = event => {
168
+ onBlur && onBlur(event); // HACK: wait a tick and check the focused element before hiding truncated tokens
169
+ // this prevents the tokens from hiding when the user is moving focus from the input to a token,
170
+ // but still hides the tokens when the user blurs the input by tabbing out or clicking somewhere else on the page
171
+
172
+ setTimeout(() => {
173
+ var _containerRef$current5;
174
+
175
+ if (!((_containerRef$current5 = containerRef.current) !== null && _containerRef$current5 !== void 0 && _containerRef$current5.contains(document.activeElement)) && visibleTokenCount) {
176
+ setTokensAreTruncated(true);
177
+ }
178
+ }, 0);
130
179
  };
131
180
 
132
181
  const handleInputKeyDown = e => {
133
- var _ref$current2;
182
+ var _ref$current3;
134
183
 
135
184
  if (onKeyDown) {
136
185
  onKeyDown(e);
137
186
  }
138
187
 
139
- if ((_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.value) {
188
+ if ((_ref$current3 = ref.current) !== null && _ref$current3 !== void 0 && _ref$current3.value) {
140
189
  return;
141
190
  }
142
191
 
@@ -157,13 +206,24 @@ function TextInputWithTokensInnerComponent({
157
206
 
158
207
 
159
208
  setTimeout(() => {
160
- var _ref$current3;
209
+ var _ref$current4;
161
210
 
162
- (_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.select();
211
+ (_ref$current4 = ref.current) === null || _ref$current4 === void 0 ? void 0 : _ref$current4.select();
163
212
  }, 0);
164
213
  }
165
214
  };
166
215
 
216
+ const focusInput = () => {
217
+ var _combinedInputRef$cur;
218
+
219
+ (_combinedInputRef$cur = combinedInputRef.current) === null || _combinedInputRef$cur === void 0 ? void 0 : _combinedInputRef$cur.focus();
220
+ };
221
+
222
+ const preventTokenClickPropagation = event => {
223
+ event.stopPropagation();
224
+ };
225
+
226
+ const visibleTokens = tokensAreTruncated ? tokens.slice(0, visibleTokenCount) : tokens;
167
227
  return /*#__PURE__*/_react.default.createElement(_TextInputWrapper.default, {
168
228
  block: block,
169
229
  className: className,
@@ -175,15 +235,8 @@ function TextInputWithTokensInnerComponent({
175
235
  minWidth: minWidthProp,
176
236
  maxWidth: maxWidthProp,
177
237
  variant: variantProp,
178
- ref: containerRef,
179
- sx: {
180
- alignItems: 'center',
181
- flexWrap: preventTokenWrapping ? 'nowrap' : 'wrap',
182
- gap: '0.25rem',
183
- '> *': {
184
- flexShrink: 0
185
- },
186
- ...(block ? {
238
+ onClick: focusInput,
239
+ sx: { ...(block ? {
187
240
  display: 'flex',
188
241
  width: '100%'
189
242
  } : {}),
@@ -196,6 +249,21 @@ function TextInputWithTokensInnerComponent({
196
249
  } : {}),
197
250
  ...sxProp
198
251
  }
252
+ }, /*#__PURE__*/_react.default.createElement(_Box.default, {
253
+ ref: containerRef,
254
+ display: "flex",
255
+ sx: {
256
+ alignItems: 'center',
257
+ flexWrap: preventTokenWrapping ? 'nowrap' : 'wrap',
258
+ marginLeft: '-0.25rem',
259
+ marginBottom: '-0.25rem',
260
+ flexGrow: 1,
261
+ '> *': {
262
+ flexShrink: 0,
263
+ marginLeft: '0.25rem',
264
+ marginBottom: '0.25rem'
265
+ }
266
+ }
199
267
  }, /*#__PURE__*/_react.default.createElement(_Box.default, {
200
268
  sx: {
201
269
  order: 1,
@@ -207,12 +275,13 @@ function TextInputWithTokensInnerComponent({
207
275
  ref: combinedInputRef,
208
276
  disabled: disabled,
209
277
  onFocus: handleInputFocus,
278
+ onBlur: handleInputBlur,
210
279
  onKeyDown: handleInputKeyDown,
211
280
  type: "text",
212
281
  sx: {
213
282
  height: '100%'
214
283
  }
215
- }, inputPropsRest))), tokens.length && TokenComponent ? tokens.map(({
284
+ }, inputPropsRest))), TokenComponent ? visibleTokens.map(({
216
285
  id,
217
286
  ...tokenRest
218
287
  }, i) => /*#__PURE__*/_react.default.createElement(TokenComponent, _extends({
@@ -220,6 +289,7 @@ function TextInputWithTokensInnerComponent({
220
289
  onFocus: handleTokenFocus(i),
221
290
  onBlur: handleTokenBlur,
222
291
  onKeyUp: handleTokenKeyUp,
292
+ onClick: preventTokenClickPropagation,
223
293
  isSelected: selectedTokenIndex === i,
224
294
  onRemove: () => {
225
295
  handleTokenRemove(id);
@@ -227,7 +297,10 @@ function TextInputWithTokensInnerComponent({
227
297
  hideRemoveButton: hideTokenRemoveButtons,
228
298
  size: size,
229
299
  tabIndex: 0
230
- }, tokenRest))) : null);
300
+ }, tokenRest))) : null, tokensAreTruncated ? /*#__PURE__*/_react.default.createElement(_Text.default, {
301
+ color: "fg.muted",
302
+ fontSize: size && overflowCountFontSizeMap[size]
303
+ }, "+", tokens.length - visibleTokens.length) : null));
231
304
  }
232
305
 
233
306
  TextInputWithTokensInnerComponent.displayName = "TextInputWithTokensInnerComponent";
@@ -39,7 +39,16 @@ const DefaultTokenStyled = (0, _styledComponents.default)(_TokenBase.default).wi
39
39
  const LeadingVisualContainer = (0, _styledComponents.default)('span').withConfig({
40
40
  displayName: "Token__LeadingVisualContainer",
41
41
  componentId: "sc-1dg52pw-1"
42
- })(["flex-shrink:0;line-height:0;"]);
42
+ })(["flex-shrink:0;line-height:0;", ""], props => {
43
+ switch (props.size) {
44
+ case 'large':
45
+ case 'extralarge':
46
+ return (0, _styledComponents.css)(["margin-right:", ";"], (0, _constants.get)('space.2'));
47
+
48
+ default:
49
+ return (0, _styledComponents.css)(["margin-right:", ";"], (0, _constants.get)('space.1'));
50
+ }
51
+ });
43
52
  const Token = /*#__PURE__*/(0, _react.forwardRef)((props, forwardedRef) => {
44
53
  const {
45
54
  as,
@@ -74,7 +83,9 @@ const Token = /*#__PURE__*/(0, _react.forwardRef)((props, forwardedRef) => {
74
83
  isTokenInteractive: (0, _TokenBase.isTokenInteractive)(props)
75
84
  }, !hasMultipleActionTargets ? interactiveTokenProps : {}, rest, {
76
85
  ref: forwardedRef
77
- }), LeadingVisual ? /*#__PURE__*/_react.default.createElement(LeadingVisualContainer, null, /*#__PURE__*/_react.default.createElement(LeadingVisual, null)) : null, /*#__PURE__*/_react.default.createElement(_TokenTextContainer.default, hasMultipleActionTargets ? interactiveTokenProps : {}, text), !hideRemoveButton && onRemove ? /*#__PURE__*/_react.default.createElement(_RemoveTokenButton.default, {
86
+ }), LeadingVisual ? /*#__PURE__*/_react.default.createElement(LeadingVisualContainer, {
87
+ size: size
88
+ }, /*#__PURE__*/_react.default.createElement(LeadingVisual, null)) : null, /*#__PURE__*/_react.default.createElement(_TokenTextContainer.default, hasMultipleActionTargets ? interactiveTokenProps : {}, text), !hideRemoveButton && onRemove ? /*#__PURE__*/_react.default.createElement(_RemoveTokenButton.default, {
78
89
  borderOffset: tokenBorderWidthPx,
79
90
  onClick: onRemoveClick,
80
91
  size: size,
@@ -38,7 +38,6 @@ const variants = (0, _styledSystem.variant)({
38
38
  variants: {
39
39
  small: {
40
40
  fontSize: 0,
41
- gap: 1,
42
41
  height: tokenSizes.small,
43
42
  // without setting lineHeight to match height, the "x" appears vertically mis-aligned
44
43
  lineHeight: tokenSizes.small,
@@ -51,7 +50,6 @@ const variants = (0, _styledSystem.variant)({
51
50
  },
52
51
  medium: {
53
52
  fontSize: 0,
54
- gap: 1,
55
53
  height: tokenSizes.medium,
56
54
  lineHeight: tokenSizes.medium,
57
55
  paddingLeft: 2,
@@ -61,7 +59,6 @@ const variants = (0, _styledSystem.variant)({
61
59
  },
62
60
  large: {
63
61
  fontSize: 0,
64
- gap: 2,
65
62
  height: tokenSizes.large,
66
63
  lineHeight: tokenSizes.large,
67
64
  paddingLeft: 2,
@@ -71,7 +68,6 @@ const variants = (0, _styledSystem.variant)({
71
68
  },
72
69
  extralarge: {
73
70
  fontSize: 1,
74
- gap: 2,
75
71
  height: tokenSizes.extralarge,
76
72
  lineHeight: tokenSizes.extralarge,
77
73
  paddingLeft: 3,
@@ -9,7 +9,7 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _octiconsReact = require("@primer/octicons-react");
11
11
 
12
- var _styledComponents = _interopRequireDefault(require("styled-components"));
12
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
13
13
 
14
14
  var _styledSystem = require("styled-system");
15
15
 
@@ -19,6 +19,10 @@ var _sx = _interopRequireDefault(require("../sx"));
19
19
 
20
20
  var _TokenBase = require("./TokenBase");
21
21
 
22
+ 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); }
23
+
24
+ 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; }
25
+
22
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
27
 
24
28
  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); }
@@ -50,7 +54,16 @@ const getTokenButtonIconSize = size => parseInt(_TokenBase.tokenSizes[size || _T
50
54
  const StyledTokenButton = _styledComponents.default.span.withConfig({
51
55
  displayName: "_RemoveTokenButton__StyledTokenButton",
52
56
  componentId: "sc-14lvcw1-0"
53
- })(["background-color:transparent;font-family:inherit;color:currentColor;cursor:pointer;display:inline-flex;justify-content:center;align-items:center;user-select:none;appearance:none;text-decoration:none;padding:0;transform:", ";align-self:baseline;border:0;border-radius:999px;&:hover,&:focus{background-color:", ";}&:active{background-color:", ";}", " ", ""], props => `translate(${props.borderOffset}px, -${props.borderOffset}px)`, (0, _constants.get)('colors.neutral.muted'), (0, _constants.get)('colors.neutral.subtle'), variants, _sx.default);
57
+ })(["background-color:transparent;font-family:inherit;color:currentColor;cursor:pointer;display:inline-flex;justify-content:center;align-items:center;user-select:none;appearance:none;text-decoration:none;padding:0;transform:", ";align-self:baseline;border:0;border-radius:999px;", " &:hover,&:focus{background-color:", ";}&:active{background-color:", ";}", " ", ""], props => `translate(${props.borderOffset}px, -${props.borderOffset}px)`, props => {
58
+ switch (props.size) {
59
+ case 'large':
60
+ case 'extralarge':
61
+ return (0, _styledComponents.css)(["margin-left:", ";"], (0, _constants.get)('space.2'));
62
+
63
+ default:
64
+ return (0, _styledComponents.css)(["margin-left:", ";"], (0, _constants.get)('space.1'));
65
+ }
66
+ }, (0, _constants.get)('colors.neutral.muted'), (0, _constants.get)('colors.neutral.subtle'), variants, _sx.default);
54
67
 
55
68
  const RemoveTokenButton = ({
56
69
  'aria-label': ariaLabel,
@@ -39,7 +39,7 @@ 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:", ";", " .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 {
@@ -515,7 +515,7 @@ module.exports = {
515
515
  }
516
516
  }
517
517
  },
518
- "light_colorblind": {
518
+ "light_protanopia": {
519
519
  "colors": {
520
520
  "canvasDefaultTransparent": "rgba(255,255,255,0)",
521
521
  "marketingIcon": {
@@ -2456,7 +2456,7 @@ module.exports = {
2456
2456
  }
2457
2457
  }
2458
2458
  },
2459
- "dark_colorblind": {
2459
+ "dark_protanopia": {
2460
2460
  "colors": {
2461
2461
  "canvasDefaultTransparent": "rgba(13,17,23,0)",
2462
2462
  "marketingIcon": {
@@ -53,7 +53,7 @@ export declare function render(component: React.ReactElement, theme?: {
53
53
  xlarge: string;
54
54
  };
55
55
  space: string[];
56
- colorSchemes: Record<"light" | "light_colorblind" | "dark" | "dark_dimmed" | "dark_high_contrast" | "dark_colorblind", Record<"colors" | "shadows", Partial<{
56
+ colorSchemes: Record<"light" | "light_protanopia" | "dark" | "dark_dimmed" | "dark_high_contrast" | "dark_protanopia", Record<"colors" | "shadows", Partial<{
57
57
  canvasDefaultTransparent: string;
58
58
  marketingIcon: {
59
59
  primary: string;
@@ -28,13 +28,19 @@ export interface ItemProps extends SxProp {
28
28
  */
29
29
  leadingVisual?: React.FunctionComponent<IconProps>;
30
30
  /**
31
+ * @deprecated Use `trailingVisual` instead
31
32
  * Icon (or similar) positioned after `Item` text.
32
33
  */
33
34
  trailingIcon?: React.FunctionComponent<IconProps>;
34
35
  /**
36
+ * @deprecated Use `trailingVisual` instead
35
37
  * Text positioned after `Item` text and optional trailing icon.
36
38
  */
37
39
  trailingText?: string;
40
+ /**
41
+ * Icon or text positioned after `Item` text.
42
+ */
43
+ trailingVisual?: React.ReactNode;
38
44
  /**
39
45
  * Style variations associated with various `Item` types.
40
46
  *