@primer/components 0.0.0-202194204247 → 0.0.0-20219421241

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 (78) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/browser.esm.js +294 -298
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +364 -368
  5. package/dist/browser.umd.js.map +1 -1
  6. package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +1 -2
  7. package/lib/AnchoredOverlay/AnchoredOverlay.js +3 -11
  8. package/lib/FilteredActionList/FilteredActionList.js +31 -5
  9. package/lib/Overlay.d.ts +1 -2
  10. package/lib/Overlay.js +5 -10
  11. package/lib/SelectMenu/SelectMenu.d.ts +2 -8
  12. package/lib/TextInput.d.ts +3 -6
  13. package/lib/TextInput.js +10 -9
  14. package/lib/Token/Token.js +1 -1
  15. package/lib/Token/TokenBase.js +3 -3
  16. package/lib/Token/TokenLabel.js +3 -3
  17. package/lib/Token/_tokenButtonUtils.d.ts +1 -1
  18. package/lib/hooks/useOverlay.d.ts +1 -2
  19. package/lib/hooks/useOverlay.js +6 -11
  20. package/lib/index.d.ts +0 -2
  21. package/lib/index.js +0 -16
  22. package/lib/utils/types.d.ts +0 -3
  23. package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +1 -2
  24. package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +3 -11
  25. package/lib-esm/FilteredActionList/FilteredActionList.js +31 -3
  26. package/lib-esm/Overlay.d.ts +1 -2
  27. package/lib-esm/Overlay.js +5 -8
  28. package/lib-esm/SelectMenu/SelectMenu.d.ts +2 -8
  29. package/lib-esm/TextInput.d.ts +3 -6
  30. package/lib-esm/TextInput.js +9 -8
  31. package/lib-esm/Token/Token.js +1 -1
  32. package/lib-esm/Token/TokenBase.js +3 -3
  33. package/lib-esm/Token/TokenLabel.js +3 -3
  34. package/lib-esm/Token/_RemoveTokenButton.js +1 -1
  35. package/lib-esm/Token/_tokenButtonUtils.d.ts +1 -1
  36. package/lib-esm/Token/_tokenButtonUtils.js +1 -1
  37. package/lib-esm/hooks/useOverlay.d.ts +1 -2
  38. package/lib-esm/hooks/useOverlay.js +6 -11
  39. package/lib-esm/index.d.ts +0 -2
  40. package/lib-esm/index.js +0 -2
  41. package/lib-esm/utils/types.d.ts +0 -3
  42. package/package.json +1 -1
  43. package/lib/Autocomplete/Autocomplete.d.ts +0 -40
  44. package/lib/Autocomplete/Autocomplete.js +0 -68
  45. package/lib/Autocomplete/AutocompleteContext.d.ts +0 -17
  46. package/lib/Autocomplete/AutocompleteContext.js +0 -11
  47. package/lib/Autocomplete/AutocompleteInput.d.ts +0 -9
  48. package/lib/Autocomplete/AutocompleteInput.js +0 -142
  49. package/lib/Autocomplete/AutocompleteMenu.d.ts +0 -71
  50. package/lib/Autocomplete/AutocompleteMenu.js +0 -223
  51. package/lib/Autocomplete/AutocompleteOverlay.d.ts +0 -17
  52. package/lib/Autocomplete/AutocompleteOverlay.js +0 -69
  53. package/lib/Autocomplete/index.d.ts +0 -2
  54. package/lib/Autocomplete/index.js +0 -15
  55. package/lib/TextInputWithTokens.d.ts +0 -43
  56. package/lib/TextInputWithTokens.js +0 -236
  57. package/lib/_UnstyledTextInput.d.ts +0 -2
  58. package/lib/_UnstyledTextInput.js +0 -20
  59. package/lib/utils/scrollIntoViewingArea.d.ts +0 -1
  60. package/lib/utils/scrollIntoViewingArea.js +0 -39
  61. package/lib-esm/Autocomplete/Autocomplete.d.ts +0 -40
  62. package/lib-esm/Autocomplete/Autocomplete.js +0 -47
  63. package/lib-esm/Autocomplete/AutocompleteContext.d.ts +0 -17
  64. package/lib-esm/Autocomplete/AutocompleteContext.js +0 -2
  65. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +0 -9
  66. package/lib-esm/Autocomplete/AutocompleteInput.js +0 -123
  67. package/lib-esm/Autocomplete/AutocompleteMenu.d.ts +0 -71
  68. package/lib-esm/Autocomplete/AutocompleteMenu.js +0 -204
  69. package/lib-esm/Autocomplete/AutocompleteOverlay.d.ts +0 -17
  70. package/lib-esm/Autocomplete/AutocompleteOverlay.js +0 -51
  71. package/lib-esm/Autocomplete/index.d.ts +0 -2
  72. package/lib-esm/Autocomplete/index.js +0 -1
  73. package/lib-esm/TextInputWithTokens.d.ts +0 -43
  74. package/lib-esm/TextInputWithTokens.js +0 -209
  75. package/lib-esm/_UnstyledTextInput.d.ts +0 -2
  76. package/lib-esm/_UnstyledTextInput.js +0 -7
  77. package/lib-esm/utils/scrollIntoViewingArea.d.ts +0 -1
  78. package/lib-esm/utils/scrollIntoViewingArea.js +0 -30
@@ -1,223 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _ActionList = require("../ActionList");
11
-
12
- var _useFocusZone = require("../hooks/useFocusZone");
13
-
14
- var _ = require("../");
15
-
16
- var _AutocompleteContext = require("./AutocompleteContext");
17
-
18
- var _octiconsReact = require("@primer/octicons-react");
19
-
20
- var _uniqueId = require("../utils/uniqueId");
21
-
22
- var _scrollIntoViewingArea = require("../utils/scrollIntoViewingArea");
23
-
24
- 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); }
25
-
26
- 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; }
27
-
28
- const getDefaultSortFn = isItemSelectedFn => (itemIdA, itemIdB) => isItemSelectedFn(itemIdA) === isItemSelectedFn(itemIdB) ? 0 : isItemSelectedFn(itemIdA) ? -1 : 1;
29
-
30
- function getDefaultItemFilter(filterValue) {
31
- return function (item, _i) {
32
- var _item$text;
33
-
34
- return Boolean((_item$text = item.text) === null || _item$text === void 0 ? void 0 : _item$text.toLowerCase().startsWith(filterValue.toLowerCase()));
35
- };
36
- }
37
-
38
- function getDefaultOnSelectionChange(setInputValueFn) {
39
- return function (itemOrItems) {
40
- const {
41
- text = ''
42
- } = Array.isArray(itemOrItems) ? itemOrItems.slice(-1)[0] : itemOrItems;
43
- setInputValueFn && setInputValueFn(text);
44
- };
45
- }
46
-
47
- const isItemSelected = (itemId, selectedItemIds) => selectedItemIds.includes(itemId);
48
-
49
- function getItemById(itemId, items) {
50
- return items.find(item => item.id === itemId);
51
- }
52
-
53
- ;
54
-
55
- // TODO: consider making 'aria-labelledby' required
56
- function AutocompleteMenu(props) {
57
- const {
58
- activeDescendantRef,
59
- id,
60
- inputRef,
61
- inputValue = '',
62
- scrollContainerRef,
63
- setAutocompleteSuggestion,
64
- setShowMenu,
65
- setInputValue,
66
- setIsMenuDirectlyActivated,
67
- setSelectedItemLength,
68
- showMenu
69
- } = (0, _react.useContext)(_AutocompleteContext.AutocompleteContext);
70
- const {
71
- items,
72
- selectedItemIds,
73
- sortOnCloseFn,
74
- emptyStateText,
75
- addNewItem,
76
- loading,
77
- selectionVariant,
78
- filterFn = getDefaultItemFilter(inputValue),
79
- "aria-labelledby": ariaLabelledBy,
80
- onOpenChange,
81
- onSelectedChange = getDefaultOnSelectionChange(setInputValue),
82
- customScrollContainerRef
83
- } = props;
84
- const listContainerRef = (0, _react.useRef)(null);
85
- const [highlightedItem, setHighlightedItem] = (0, _react.useState)();
86
- const [sortedItemIds, setSortedItemIds] = (0, _react.useState)(items.map(({
87
- id
88
- }) => id));
89
- const selectableItems = (0, _react.useMemo)(() => items.map(selectableItem => {
90
- return { ...selectableItem,
91
- role: "option",
92
- id: selectableItem.id,
93
- selected: selectionVariant === 'multiple' ? selectedItemIds.includes(selectableItem.id) : undefined,
94
- onAction: item => {
95
- const otherSelectedItemIds = selectedItemIds.filter(selectedItemId => selectedItemId !== item.id);
96
- const newSelectedItemIds = selectedItemIds.includes(item.id) ? otherSelectedItemIds : [...otherSelectedItemIds, item.id];
97
- onSelectedChange && onSelectedChange(newSelectedItemIds.map(newSelectedItemId => getItemById(newSelectedItemId, items)));
98
-
99
- if (selectionVariant === 'multiple') {
100
- setInputValue && setInputValue('');
101
- setAutocompleteSuggestion && setAutocompleteSuggestion('');
102
- } else {
103
- var _inputRef$current;
104
-
105
- setShowMenu && setShowMenu(false);
106
- inputRef === null || inputRef === void 0 ? void 0 : (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.setSelectionRange(inputRef.current.value.length, inputRef.current.value.length);
107
- }
108
- }
109
- };
110
- }), [items, selectedItemIds]);
111
- const itemSortOrderData = (0, _react.useMemo)(() => sortedItemIds.reduce((acc, curr, i) => {
112
- acc[curr] = i;
113
- return acc;
114
- }, {}), [sortedItemIds]);
115
- const sortedAndFilteredItemsToRender = (0, _react.useMemo)(() => selectableItems.filter((item, i) => filterFn(item, i)).sort((a, b) => itemSortOrderData[a.id] - itemSortOrderData[b.id]), [selectableItems]);
116
- const allItemsToRender = (0, _react.useMemo)(() => [// sorted and filtered selectable items
117
- ...sortedAndFilteredItemsToRender, // menu item used for creating a token from whatever is in the text input
118
- ...(addNewItem ? [{ ...addNewItem,
119
- leadingVisual: () => /*#__PURE__*/_react.default.createElement(_octiconsReact.PlusIcon, null),
120
- onAction: (item, e) => {
121
- // TODO: make it possible to pass a leadingVisual when using `addNewItem`
122
- addNewItem.handleAddItem({ ...item,
123
- id: item.id || (0, _uniqueId.uniqueId)(),
124
- leadingVisual: undefined
125
- });
126
-
127
- if (selectionVariant === 'multiple') {
128
- setInputValue && setInputValue('');
129
- setAutocompleteSuggestion && setAutocompleteSuggestion('');
130
- }
131
- }
132
- }] : [])], [sortedAndFilteredItemsToRender, addNewItem]);
133
- (0, _useFocusZone.useFocusZone)({
134
- containerRef: listContainerRef,
135
- focusOutBehavior: 'wrap',
136
- focusableElementFilter: element => {
137
- return !(element instanceof HTMLInputElement);
138
- },
139
- activeDescendantFocus: inputRef,
140
- onActiveDescendantChanged: (current, _previous, directlyActivated) => {
141
- if (activeDescendantRef) {
142
- activeDescendantRef.current = current || null;
143
- }
144
-
145
- if (current) {
146
- const selectedItem = selectableItems.find(item => item.id.toString() === (current === null || current === void 0 ? void 0 : current.dataset.id));
147
- setHighlightedItem(selectedItem);
148
- setIsMenuDirectlyActivated && setIsMenuDirectlyActivated(directlyActivated);
149
- }
150
-
151
- if (current && customScrollContainerRef && customScrollContainerRef.current && directlyActivated) {
152
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(current, customScrollContainerRef.current);
153
- } else if (current && scrollContainerRef && scrollContainerRef.current && directlyActivated) {
154
- (0, _scrollIntoViewingArea.scrollIntoViewingArea)(current, scrollContainerRef.current);
155
- }
156
- }
157
- }, [loading]);
158
- (0, _react.useEffect)(() => {
159
- var _highlightedItem$text;
160
-
161
- if (!setAutocompleteSuggestion) {
162
- return;
163
- }
164
-
165
- if (highlightedItem !== null && highlightedItem !== void 0 && (_highlightedItem$text = highlightedItem.text) !== null && _highlightedItem$text !== void 0 && _highlightedItem$text.startsWith(inputValue) && !selectedItemIds.includes(highlightedItem.id)) {
166
- setAutocompleteSuggestion(highlightedItem.text);
167
- } else {
168
- setAutocompleteSuggestion('');
169
- }
170
- }, [highlightedItem, inputValue]);
171
- (0, _react.useEffect)(() => {
172
- if (showMenu === false) {
173
- setSortedItemIds([...sortedItemIds].sort(sortOnCloseFn ? sortOnCloseFn : getDefaultSortFn(itemId => isItemSelected(itemId, selectedItemIds))));
174
- }
175
-
176
- onOpenChange && onOpenChange(Boolean(showMenu));
177
- }, [showMenu]);
178
- (0, _react.useEffect)(() => {
179
- if (selectedItemIds.length) {
180
- setSelectedItemLength && setSelectedItemLength(selectedItemIds.length);
181
- }
182
- }, [selectedItemIds]);
183
- console.log('AutocompleteMenu re-rendering');
184
- return /*#__PURE__*/_react.default.createElement(_.Box, {
185
- sx: !showMenu ? {
186
- // visually hides this label for sighted users
187
- position: 'absolute',
188
- width: '1px',
189
- height: '1px',
190
- padding: '0',
191
- margin: '-1px',
192
- overflow: 'hidden',
193
- clip: 'rect(0, 0, 0, 0)',
194
- whiteSpace: 'nowrap',
195
- borderWidth: '0'
196
- } : {}
197
- }, loading ? /*#__PURE__*/_react.default.createElement(_.Box, {
198
- p: 3,
199
- display: "flex",
200
- justifyContent: "center"
201
- }, /*#__PURE__*/_react.default.createElement(_.Spinner, null)) : /*#__PURE__*/_react.default.createElement("div", {
202
- ref: listContainerRef
203
- }, allItemsToRender.length ? /*#__PURE__*/_react.default.createElement(_ActionList.ActionList, {
204
- selectionVariant: "multiple" // have to typecast to `ItemProps` because we have an extra property
205
- // on `items` for Autocomplete: `metadata`
206
- ,
207
- items: allItemsToRender,
208
- role: "listbox",
209
- id: `${id}-listbox`,
210
- "aria-labelledby": ariaLabelledBy
211
- }) : /*#__PURE__*/_react.default.createElement(_.Box, {
212
- p: 3
213
- }, emptyStateText)));
214
- }
215
-
216
- AutocompleteMenu.displayName = "AutocompleteMenu";
217
- AutocompleteMenu.defaultProps = {
218
- emptyStateText: 'No selectable options',
219
- selectionVariant: 'single'
220
- };
221
- AutocompleteMenu.displayName = 'AutocompleteMenu';
222
- var _default = AutocompleteMenu;
223
- exports.default = _default;
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
- import { OverlayProps } from '../Overlay';
3
- import { ComponentProps } from '../utils/types';
4
- declare type AutocompleteOverlayInternalProps = {
5
- /**
6
- * The ref of the element that the position of the menu is based on. By default, the menu is positioned based on the text input
7
- */
8
- menuAnchorRef?: React.RefObject<HTMLElement>;
9
- /**
10
- * Props to be spread on the internal `Overlay` component.
11
- */
12
- overlayProps?: Partial<OverlayProps>;
13
- children?: React.ReactNode;
14
- } & Pick<React.AriaAttributes, 'aria-labelledby'>;
15
- declare const AutocompleteOverlay: React.FC<AutocompleteOverlayInternalProps>;
16
- export declare type AutocompleteOverlayProps = ComponentProps<typeof AutocompleteOverlay>;
17
- export default AutocompleteOverlay;
@@ -1,69 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _hooks = require("../hooks");
11
-
12
- var _Overlay = _interopRequireDefault(require("../Overlay"));
13
-
14
- var _AutocompleteContext = require("./AutocompleteContext");
15
-
16
- var _useCombinedRefs = require("../hooks/useCombinedRefs");
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- 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); }
21
-
22
- 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; }
23
-
24
- 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); }
25
-
26
- // TODO: consider making 'aria-labelledby' required
27
- const AutocompleteOverlay = ({
28
- menuAnchorRef,
29
- overlayProps,
30
- children
31
- }) => {
32
- const {
33
- inputRef,
34
- scrollContainerRef,
35
- selectedItemLength,
36
- setShowMenu,
37
- showMenu = false
38
- } = (0, _react.useContext)(_AutocompleteContext.AutocompleteContext);
39
- const {
40
- floatingElementRef,
41
- position
42
- } = (0, _hooks.useAnchoredPosition)({
43
- side: 'outside-bottom',
44
- align: 'start',
45
- anchorElementRef: menuAnchorRef ? menuAnchorRef : inputRef
46
- }, [showMenu, selectedItemLength]);
47
- const combinedOverlayRef = (0, _useCombinedRefs.useCombinedRefs)(scrollContainerRef, floatingElementRef);
48
- const closeOptionList = (0, _react.useCallback)(() => {
49
- setShowMenu && setShowMenu(false);
50
- }, [setShowMenu]);
51
- return /*#__PURE__*/_react.default.createElement(_Overlay.default, _extends({
52
- returnFocusRef: inputRef,
53
- preventFocusOnOpen: true,
54
- onClickOutside: closeOptionList,
55
- onEscape: closeOptionList,
56
- ref: combinedOverlayRef,
57
- top: position === null || position === void 0 ? void 0 : position.top,
58
- left: position === null || position === void 0 ? void 0 : position.left,
59
- visibility: showMenu ? 'visible' : 'hidden',
60
- sx: {
61
- overflow: "auto"
62
- }
63
- }, overlayProps), children);
64
- };
65
-
66
- AutocompleteOverlay.displayName = "AutocompleteOverlay";
67
- AutocompleteOverlay.displayName = 'AutocompleteOverlay';
68
- var _default = AutocompleteOverlay;
69
- exports.default = _default;
@@ -1,2 +0,0 @@
1
- export { default } from './Autocomplete';
2
- export type { AutocompleteMenuProps, AutocompleteInputProps, AutocompleteOverlayProps, } from './Autocomplete';
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _Autocomplete.default;
10
- }
11
- });
12
-
13
- var _Autocomplete = _interopRequireDefault(require("./Autocomplete"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,43 +0,0 @@
1
- import React, { ComponentPropsWithoutRef } from 'react';
2
- import { ComponentProps, MandateProps } from './utils/types';
3
- import Token, { TokenProps } from './Token/Token';
4
- import TokenLabel, { TokenLabelProps } from './Token/TokenLabel';
5
- import TokenProfile, { TokenProfileProps } from './Token/TokenProfile';
6
- import { TokenSizeKeys } from './Token/TokenBase';
7
- import { TextInputProps } from './TextInput';
8
- declare type AnyTokenProps = Partial<TokenProps & TokenLabelProps & TokenProfileProps>;
9
- declare type TokenDatum = MandateProps<AnyTokenProps, 'id' | 'text'>;
10
- declare type TextInputWithTokensInternalProps = {
11
- /**
12
- * The array of tokens to render
13
- */
14
- tokens: TokenDatum[];
15
- /**
16
- * The function that gets called when a token is removed
17
- */
18
- onTokenRemove: (tokenId: string | number) => void;
19
- /**
20
- * The component used to render each token
21
- */
22
- tokenComponent?: React.ComponentType<ComponentPropsWithoutRef<typeof Token> | ComponentPropsWithoutRef<typeof TokenLabel> | ComponentPropsWithoutRef<typeof TokenProfile>>;
23
- /**
24
- * The maximum height of the component. If the content in the input exceeds this height,
25
- * it will scroll vertically
26
- */
27
- maxHeight?: React.CSSProperties['maxHeight'];
28
- /**
29
- * Whether tokens should render inline horizontally. By default, tokens wrap to new lines.
30
- */
31
- preventTokenWrapping?: boolean;
32
- /**
33
- * The size of the tokens
34
- */
35
- tokenSizeVariant?: TokenSizeKeys;
36
- /**
37
- * Whether the remove buttons should be rendered in the tokens
38
- */
39
- hideTokenRemoveButtons?: boolean;
40
- } & TextInputProps;
41
- declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<TextInputWithTokensInternalProps, string | number | symbol> & React.RefAttributes<HTMLInputElement>>;
42
- export declare type TextInputWithTokensProps = ComponentProps<typeof TextInputWithTokens>;
43
- export default TextInputWithTokens;
@@ -1,236 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _props = require("@styled-system/props");
11
-
12
- var _styledComponents = _interopRequireDefault(require("styled-components"));
13
-
14
- var _focusZone = require("./behaviors/focusZone");
15
-
16
- var _useCombinedRefs = require("./hooks/useCombinedRefs");
17
-
18
- var _useFocusZone = require("./hooks/useFocusZone");
19
-
20
- var _Token = _interopRequireDefault(require("./Token/Token"));
21
-
22
- var _TextInput = _interopRequireDefault(require("./TextInput"));
23
-
24
- var _hooks = require("./hooks");
25
-
26
- var _UnstyledTextInput = _interopRequireDefault(require("./_UnstyledTextInput"));
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- 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); }
31
-
32
- 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; }
33
-
34
- 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
-
36
- const InputWrapper = _styledComponents.default.div.withConfig({
37
- displayName: "TextInputWithTokens__InputWrapper",
38
- componentId: "sc-8z94t5-0"
39
- })(["order:1;flex-grow:1;"]);
40
-
41
- // using forwardRef is important so that other components (ex. Autocomplete) can use the ref
42
- const TextInputWithTokensComponent = /*#__PURE__*/_react.default.forwardRef(({
43
- icon: IconComponent,
44
- contrast,
45
- className,
46
- block,
47
- disabled,
48
- theme,
49
- sx: sxProp,
50
- tokens,
51
- onTokenRemove,
52
- tokenComponent: TokenComponent,
53
- preventTokenWrapping,
54
- tokenSizeVariant,
55
- hideTokenRemoveButtons,
56
- selectedTokenIdx,
57
- setSelectedTokenIdx,
58
- ...rest
59
- }, externalRef) => {
60
- const ref = (0, _hooks.useProvidedRefOrCreate)(externalRef);
61
- const {
62
- onFocus,
63
- onKeyDown,
64
- ...inputPropsRest
65
- } = (0, _props.omit)(rest);
66
-
67
- const handleTokenFocus = tokenIdx => () => {
68
- setSelectedTokenIdx(tokenIdx);
69
- };
70
-
71
- const handleTokenBlur = () => {
72
- setSelectedTokenIdx(undefined);
73
- };
74
-
75
- const handleTokenKeyUp = e => {
76
- if (e.key === 'Escape') {
77
- var _ref$current;
78
-
79
- ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
80
- }
81
- };
82
-
83
- const handleInputFocus = e => {
84
- onFocus && onFocus(e);
85
- setSelectedTokenIdx(undefined);
86
- };
87
-
88
- const handleInputKeyDown = e => {
89
- var _ref$current2;
90
-
91
- if (onKeyDown) {
92
- onKeyDown(e);
93
- }
94
-
95
- if (ref !== null && ref !== void 0 && (_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.value) {
96
- return;
97
- }
98
-
99
- const lastToken = tokens[tokens.length - 1];
100
-
101
- if (e.key === 'Backspace' && lastToken) {
102
- onTokenRemove(lastToken.id);
103
-
104
- if (ref !== null && ref !== void 0 && ref.current) {
105
- // TODO: eliminate the first hack by making changes to the Autocomplete component
106
- //
107
- // HACKS:
108
- // 1. Directly setting `ref.current.value` instead of updating state because the autocomplete
109
- // highlight behavior doesn't work correctly if we update the value with a setState action in onChange
110
- // 2. Adding an extra space so that when I backspace, it doesn't delete the last letter
111
- ref.current.value = `${lastToken.text} `;
112
- } // HACK: for some reason we need to wait a tick for `.select()` to work
113
-
114
-
115
- setTimeout(() => {
116
- var _ref$current3;
117
-
118
- ref === null || ref === void 0 ? void 0 : (_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.select();
119
- }, 1);
120
- }
121
- };
122
-
123
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(InputWrapper, {
124
- key: "inputWrapper"
125
- }, /*#__PURE__*/_react.default.createElement(_UnstyledTextInput.default, _extends({
126
- ref: ref,
127
- disabled: disabled,
128
- onFocus: handleInputFocus,
129
- onKeyDown: handleInputKeyDown,
130
- type: "text",
131
- sx: {
132
- height: '100%'
133
- }
134
- }, inputPropsRest))), tokens !== null && tokens !== void 0 && tokens.length && TokenComponent ? tokens.map(({
135
- id,
136
- ...tokenRest
137
- }, i) => /*#__PURE__*/_react.default.createElement(TokenComponent, _extends({
138
- key: id,
139
- onFocus: handleTokenFocus(i),
140
- onBlur: handleTokenBlur,
141
- onKeyUp: handleTokenKeyUp,
142
- isSelected: selectedTokenIdx === i,
143
- handleRemove: () => {
144
- onTokenRemove(id);
145
- },
146
- hideRemoveButton: hideTokenRemoveButtons,
147
- variant: tokenSizeVariant,
148
- tabIndex: 0
149
- }, tokenRest))) : null);
150
- });
151
-
152
- const TextInputWithTokens = /*#__PURE__*/_react.default.forwardRef(({
153
- tokens,
154
- onTokenRemove,
155
- sx: sxProp,
156
- ...props
157
- }, ref) => {
158
- const localInputRef = (0, _react.useRef)(null);
159
- const combinedInputRef = (0, _useCombinedRefs.useCombinedRefs)(localInputRef, ref);
160
- const [selectedTokenIdx, setSelectedTokenIdx] = (0, _react.useState)();
161
- const {
162
- containerRef
163
- } = (0, _useFocusZone.useFocusZone)({
164
- focusOutBehavior: 'wrap',
165
- bindKeys: _focusZone.FocusKeys.ArrowHorizontal | _focusZone.FocusKeys.HomeAndEnd,
166
- focusableElementFilter: element => {
167
- return !element.getAttributeNames().includes('aria-hidden');
168
- },
169
- getNextFocusable: direction => {
170
- var _containerRef$current;
171
-
172
- if (!selectedTokenIdx && selectedTokenIdx !== 0) {
173
- return undefined;
174
- }
175
-
176
- let nextIndex = selectedTokenIdx + 1; // "+ 1" accounts for the first element: the text input
177
-
178
- if (direction === 'next') {
179
- nextIndex += 1;
180
- }
181
-
182
- if (direction === 'previous') {
183
- nextIndex -= 1;
184
- }
185
-
186
- if (nextIndex > tokens.length || nextIndex < 1) {
187
- return combinedInputRef.current || undefined;
188
- }
189
-
190
- return containerRef === null || containerRef === void 0 ? void 0 : (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.children[nextIndex];
191
- }
192
- }, [selectedTokenIdx]);
193
-
194
- const handleTokenRemove = tokenId => {
195
- onTokenRemove(tokenId);
196
-
197
- if (selectedTokenIdx) {
198
- var _containerRef$current2;
199
-
200
- const nextElementToFocus = containerRef === null || containerRef === void 0 ? void 0 : (_containerRef$current2 = containerRef.current) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.children[selectedTokenIdx];
201
- nextElementToFocus.focus();
202
- }
203
- };
204
-
205
- return /*#__PURE__*/_react.default.createElement(_TextInput.default, _extends({
206
- ref: combinedInputRef,
207
- wrapperRef: containerRef,
208
- as: TextInputWithTokensComponent,
209
- selectedTokenIdx: selectedTokenIdx,
210
- setSelectedTokenIdx: setSelectedTokenIdx,
211
- tokens: tokens,
212
- onTokenRemove: handleTokenRemove,
213
- sx: {
214
- 'alignItems': 'center',
215
- 'flexWrap': props.preventTokenWrapping ? 'nowrap' : 'wrap',
216
- 'gap': '0.25rem',
217
- '> *': {
218
- 'flexShrink': 0
219
- },
220
- ...(props.block ? {
221
- display: 'flex',
222
- width: '100%'
223
- } : {}),
224
- ...sxProp
225
- }
226
- }, props));
227
- });
228
-
229
- TextInputWithTokens.defaultProps = {
230
- tokenComponent: _Token.default,
231
- tokenSizeVariant: "xl",
232
- hideTokenRemoveButtons: false
233
- };
234
- TextInputWithTokens.displayName = 'TextInputWithTokens';
235
- var _default = TextInputWithTokens;
236
- exports.default = _default;
@@ -1,2 +0,0 @@
1
- declare const UnstyledTextInput: import("styled-components").StyledComponent<"input", any, import("./sx").SxProp, never>;
2
- export default UnstyledTextInput;
@@ -1,20 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _styledComponents = _interopRequireDefault(require("styled-components"));
9
-
10
- var _sx = _interopRequireDefault(require("./sx"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- const UnstyledTextInput = _styledComponents.default.input.withConfig({
15
- displayName: "_UnstyledTextInput__UnstyledTextInput",
16
- componentId: "sc-1jgl33s-0"
17
- })(["border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;&:focus{outline:0;}", ";"], _sx.default);
18
-
19
- var _default = UnstyledTextInput;
20
- exports.default = _default;
@@ -1 +0,0 @@
1
- export declare const scrollIntoViewingArea: (child: HTMLElement, container: HTMLElement, direction?: 'horizontal' | 'vertical', startMargin?: number, endMargin?: number, behavior?: ScrollBehavior) => void;
@@ -1,39 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.scrollIntoViewingArea = void 0;
7
-
8
- const scrollIntoViewingArea = (child, container, direction = 'vertical', startMargin = 8, endMargin = 0, behavior = 'smooth') => {
9
- const startSide = direction === 'vertical' ? 'top' : 'left';
10
- const endSide = direction === 'vertical' ? 'bottom' : 'right';
11
- const scrollSide = direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
12
- const {
13
- [startSide]: childStart,
14
- [endSide]: childEnd
15
- } = child.getBoundingClientRect();
16
- const {
17
- [startSide]: containerStart,
18
- [endSide]: containerEnd
19
- } = container.getBoundingClientRect();
20
- const isChildStartAboveViewingArea = childStart < containerStart + endMargin;
21
- const isChildBottomBelowViewingArea = childEnd > containerEnd - startMargin;
22
-
23
- if (isChildStartAboveViewingArea) {
24
- const scrollHeightToChildStart = childStart - containerStart + container[scrollSide];
25
- container.scrollTo({
26
- behavior,
27
- [startSide]: scrollHeightToChildStart - endMargin
28
- });
29
- } else if (isChildBottomBelowViewingArea) {
30
- const scrollHeightToChildBottom = childEnd - containerEnd + container[scrollSide];
31
- container.scrollTo({
32
- behavior,
33
- [startSide]: scrollHeightToChildBottom + startMargin
34
- });
35
- } // either completely in view or outside viewing area on both ends, don't scroll
36
-
37
- };
38
-
39
- exports.scrollIntoViewingArea = scrollIntoViewingArea;