@primer/components 0.0.0-2021827171555 → 0.0.0-202182722258

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 (250) hide show
  1. package/CHANGELOG.md +2 -44
  2. package/dist/browser.esm.js +626 -671
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +388 -433
  5. package/dist/browser.umd.js.map +1 -1
  6. package/lib/ActionList/Divider.js +1 -1
  7. package/lib/ActionList/Header.js +2 -2
  8. package/lib/ActionList/Item.d.ts +4 -17
  9. package/lib/ActionList/Item.js +19 -21
  10. package/lib/ActionList/List.d.ts +7 -11
  11. package/lib/ActionList/List.js +3 -3
  12. package/lib/ActionList/index.d.ts +2 -1
  13. package/lib/AnchoredOverlay/AnchoredOverlay.js +2 -2
  14. package/lib/Autocomplete/Autocomplete.d.ts +26 -0
  15. package/lib/Autocomplete/Autocomplete.js +55 -0
  16. package/lib/Autocomplete/AutocompleteContext.d.ts +13 -0
  17. package/lib/Autocomplete/AutocompleteContext.js +15 -0
  18. package/lib/Autocomplete/AutocompleteInput.d.ts +9 -0
  19. package/lib/Autocomplete/AutocompleteInput.js +139 -0
  20. package/lib/Autocomplete/AutocompleteMenu.d.ts +67 -0
  21. package/lib/Autocomplete/AutocompleteMenu.js +284 -0
  22. package/lib/Autocomplete/index.d.ts +2 -0
  23. package/lib/Autocomplete/index.js +15 -0
  24. package/lib/Avatar.d.ts +0 -4
  25. package/lib/AvatarPair.js +1 -1
  26. package/lib/AvatarStack.js +1 -1
  27. package/lib/Badge/Badge.d.ts +8 -0
  28. package/lib/Badge/Badge.js +59 -0
  29. package/lib/Badge/BadgeState.d.ts +13 -0
  30. package/lib/Badge/BadgeState.js +51 -0
  31. package/lib/Badge/_badgeStyleUtils.d.ts +3 -0
  32. package/lib/Badge/_badgeStyleUtils.js +39 -0
  33. package/lib/BranchName.js +1 -1
  34. package/lib/Breadcrumb.d.ts +23 -0
  35. package/lib/{Breadcrumbs.js → Breadcrumb.js} +23 -33
  36. package/lib/Button/Button.d.ts +1 -0
  37. package/lib/Button/Button.js +1 -1
  38. package/lib/Button/ButtonClose.d.ts +2 -1
  39. package/lib/Button/ButtonClose.js +1 -1
  40. package/lib/Button/ButtonDanger.d.ts +1 -0
  41. package/lib/Button/ButtonInvisible.d.ts +1 -0
  42. package/lib/Button/ButtonInvisible.js +1 -1
  43. package/lib/Button/ButtonOutline.d.ts +1 -0
  44. package/lib/Button/ButtonPrimary.d.ts +1 -0
  45. package/lib/Button/ButtonTableList.js +1 -1
  46. package/lib/CircleBadge.js +1 -1
  47. package/lib/CircleOcticon.d.ts +1 -0
  48. package/lib/CircleOcticon.js +1 -1
  49. package/lib/CounterLabel.js +2 -2
  50. package/lib/Dialog/ConfirmationDialog.js +1 -1
  51. package/lib/Dialog/Dialog.js +9 -9
  52. package/lib/Dialog.d.ts +3 -2
  53. package/lib/Dialog.js +4 -4
  54. package/lib/Dropdown.d.ts +4 -0
  55. package/lib/Dropdown.js +2 -2
  56. package/lib/DropdownMenu/DropdownButton.d.ts +2 -1
  57. package/lib/DropdownStyles.js +6 -6
  58. package/lib/FilterList.d.ts +1 -0
  59. package/lib/FilterList.js +1 -1
  60. package/lib/FilteredActionList/FilteredActionList.js +8 -34
  61. package/lib/Flash.js +1 -1
  62. package/lib/Label.js +2 -2
  63. package/lib/Link.js +1 -1
  64. package/lib/Overlay.d.ts +2 -1
  65. package/lib/Overlay.js +11 -6
  66. package/lib/Pagehead.js +1 -1
  67. package/lib/Pagination/Pagination.js +1 -1
  68. package/lib/Popover.js +1 -1
  69. package/lib/Position.d.ts +4 -4
  70. package/lib/ProgressBar.js +1 -1
  71. package/lib/SelectMenu/SelectMenu.d.ts +344 -15
  72. package/lib/SelectMenu/SelectMenuDivider.js +1 -1
  73. package/lib/SelectMenu/SelectMenuFilter.d.ts +1 -1
  74. package/lib/SelectMenu/SelectMenuFilter.js +1 -1
  75. package/lib/SelectMenu/SelectMenuFooter.js +1 -1
  76. package/lib/SelectMenu/SelectMenuHeader.js +2 -2
  77. package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
  78. package/lib/SelectMenu/SelectMenuItem.js +1 -1
  79. package/lib/SelectMenu/SelectMenuList.js +1 -1
  80. package/lib/SelectMenu/SelectMenuLoadingAnimation.js +1 -1
  81. package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
  82. package/lib/SelectMenu/SelectMenuModal.js +2 -2
  83. package/lib/SelectMenu/SelectMenuTab.js +1 -1
  84. package/lib/SelectMenu/SelectMenuTabPanel.js +1 -1
  85. package/lib/SelectPanel/SelectPanel.js +2 -3
  86. package/lib/SideNav.js +5 -5
  87. package/lib/StateLabel.js +1 -1
  88. package/lib/SubNav.js +1 -1
  89. package/lib/TabNav.js +2 -2
  90. package/lib/TextInput.d.ts +10 -7
  91. package/lib/TextInput.js +24 -29
  92. package/lib/TextInputTokens.d.ts +43 -0
  93. package/lib/TextInputTokens.js +227 -0
  94. package/lib/TextInputWithTokens.d.ts +41 -0
  95. package/lib/TextInputWithTokens.js +396 -0
  96. package/lib/Timeline.d.ts +1 -0
  97. package/lib/Timeline.js +19 -16
  98. package/lib/Token/Token.d.ts +7 -0
  99. package/lib/Token/Token.js +63 -0
  100. package/lib/Token/TokenBase.d.ts +16 -0
  101. package/lib/Token/TokenBase.js +76 -0
  102. package/lib/Token/TokenLabel.d.ts +10 -0
  103. package/lib/Token/TokenLabel.js +115 -0
  104. package/lib/Token/TokenProfile.d.ts +7 -0
  105. package/lib/Token/TokenProfile.js +45 -0
  106. package/lib/Token/_RemoveTokenButton.d.ts +3 -0
  107. package/lib/Token/_RemoveTokenButton.js +43 -0
  108. package/lib/Token/_tokenButtonUtils.d.ts +9 -0
  109. package/lib/Token/_tokenButtonUtils.js +42 -0
  110. package/lib/Tooltip.js +1 -1
  111. package/lib/UnderlineNav.js +2 -2
  112. package/lib/_UnstyledTextInput.d.ts +2 -0
  113. package/lib/_UnstyledTextInput.js +20 -0
  114. package/lib/hooks/useOverlay.d.ts +2 -1
  115. package/lib/hooks/useOverlay.js +11 -6
  116. package/lib/index.d.ts +2 -3
  117. package/lib/index.js +2 -22
  118. package/lib/theme-preval.d.ts +6 -12
  119. package/lib/theme-preval.js +0 -940
  120. package/lib/utils/scrollIntoViewingArea.d.ts +1 -0
  121. package/lib/utils/scrollIntoViewingArea.js +39 -0
  122. package/lib/utils/testing.d.ts +0 -1854
  123. package/lib/utils/types.d.ts +3 -0
  124. package/lib/utils/uniqueId.js +0 -1
  125. package/lib-esm/ActionList/Divider.js +1 -1
  126. package/lib-esm/ActionList/Header.js +2 -2
  127. package/lib-esm/ActionList/Item.d.ts +4 -17
  128. package/lib-esm/ActionList/Item.js +19 -22
  129. package/lib-esm/ActionList/List.d.ts +7 -11
  130. package/lib-esm/ActionList/List.js +3 -3
  131. package/lib-esm/ActionList/index.d.ts +2 -1
  132. package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +3 -3
  133. package/lib-esm/Autocomplete/Autocomplete.d.ts +26 -0
  134. package/lib-esm/Autocomplete/Autocomplete.js +36 -0
  135. package/lib-esm/Autocomplete/AutocompleteContext.d.ts +13 -0
  136. package/lib-esm/Autocomplete/AutocompleteContext.js +6 -0
  137. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +9 -0
  138. package/lib-esm/Autocomplete/AutocompleteInput.js +120 -0
  139. package/lib-esm/Autocomplete/AutocompleteMenu.d.ts +67 -0
  140. package/lib-esm/Autocomplete/AutocompleteMenu.js +258 -0
  141. package/lib-esm/Autocomplete/index.d.ts +2 -0
  142. package/lib-esm/Autocomplete/index.js +1 -0
  143. package/lib-esm/Avatar.d.ts +0 -4
  144. package/lib-esm/AvatarPair.js +1 -1
  145. package/lib-esm/AvatarStack.js +1 -1
  146. package/lib-esm/Badge/Badge.d.ts +8 -0
  147. package/lib-esm/Badge/Badge.js +44 -0
  148. package/lib-esm/Badge/BadgeState.d.ts +13 -0
  149. package/lib-esm/Badge/BadgeState.js +40 -0
  150. package/lib-esm/Badge/_badgeStyleUtils.d.ts +3 -0
  151. package/lib-esm/Badge/_badgeStyleUtils.js +29 -0
  152. package/lib-esm/BranchName.js +1 -1
  153. package/lib-esm/Breadcrumb.d.ts +23 -0
  154. package/lib-esm/{Breadcrumbs.js → Breadcrumb.js} +21 -30
  155. package/lib-esm/Button/Button.d.ts +1 -0
  156. package/lib-esm/Button/Button.js +1 -1
  157. package/lib-esm/Button/ButtonClose.d.ts +2 -1
  158. package/lib-esm/Button/ButtonClose.js +1 -1
  159. package/lib-esm/Button/ButtonDanger.d.ts +1 -0
  160. package/lib-esm/Button/ButtonInvisible.d.ts +1 -0
  161. package/lib-esm/Button/ButtonInvisible.js +1 -1
  162. package/lib-esm/Button/ButtonOutline.d.ts +1 -0
  163. package/lib-esm/Button/ButtonPrimary.d.ts +1 -0
  164. package/lib-esm/Button/ButtonTableList.js +1 -1
  165. package/lib-esm/CircleBadge.js +1 -1
  166. package/lib-esm/CircleOcticon.d.ts +1 -0
  167. package/lib-esm/CircleOcticon.js +1 -1
  168. package/lib-esm/CounterLabel.js +2 -2
  169. package/lib-esm/Dialog/ConfirmationDialog.js +1 -1
  170. package/lib-esm/Dialog/Dialog.js +8 -8
  171. package/lib-esm/Dialog.d.ts +3 -2
  172. package/lib-esm/Dialog.js +4 -4
  173. package/lib-esm/Dropdown.d.ts +4 -0
  174. package/lib-esm/Dropdown.js +2 -2
  175. package/lib-esm/DropdownMenu/DropdownButton.d.ts +2 -1
  176. package/lib-esm/DropdownStyles.js +6 -6
  177. package/lib-esm/FilterList.d.ts +1 -0
  178. package/lib-esm/FilterList.js +1 -1
  179. package/lib-esm/FilteredActionList/FilteredActionList.js +6 -34
  180. package/lib-esm/Flash.js +1 -1
  181. package/lib-esm/Label.js +2 -2
  182. package/lib-esm/Link.js +1 -1
  183. package/lib-esm/Overlay.d.ts +2 -1
  184. package/lib-esm/Overlay.js +9 -6
  185. package/lib-esm/Pagehead.js +1 -1
  186. package/lib-esm/Pagination/Pagination.js +1 -1
  187. package/lib-esm/Popover.js +1 -1
  188. package/lib-esm/Position.d.ts +4 -4
  189. package/lib-esm/ProgressBar.js +1 -1
  190. package/lib-esm/SelectMenu/SelectMenu.d.ts +344 -15
  191. package/lib-esm/SelectMenu/SelectMenuDivider.js +1 -1
  192. package/lib-esm/SelectMenu/SelectMenuFilter.d.ts +1 -1
  193. package/lib-esm/SelectMenu/SelectMenuFilter.js +1 -1
  194. package/lib-esm/SelectMenu/SelectMenuFooter.js +1 -1
  195. package/lib-esm/SelectMenu/SelectMenuHeader.js +2 -2
  196. package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
  197. package/lib-esm/SelectMenu/SelectMenuItem.js +1 -1
  198. package/lib-esm/SelectMenu/SelectMenuList.js +1 -1
  199. package/lib-esm/SelectMenu/SelectMenuLoadingAnimation.js +1 -1
  200. package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
  201. package/lib-esm/SelectMenu/SelectMenuModal.js +2 -2
  202. package/lib-esm/SelectMenu/SelectMenuTab.js +1 -1
  203. package/lib-esm/SelectMenu/SelectMenuTabPanel.js +1 -1
  204. package/lib-esm/SelectPanel/SelectPanel.js +2 -3
  205. package/lib-esm/SideNav.js +5 -5
  206. package/lib-esm/StateLabel.js +1 -1
  207. package/lib-esm/SubNav.js +1 -1
  208. package/lib-esm/TabNav.js +2 -2
  209. package/lib-esm/TextInput.d.ts +10 -7
  210. package/lib-esm/TextInput.js +23 -29
  211. package/lib-esm/TextInputTokens.d.ts +43 -0
  212. package/lib-esm/TextInputTokens.js +200 -0
  213. package/lib-esm/TextInputWithTokens.d.ts +41 -0
  214. package/lib-esm/TextInputWithTokens.js +361 -0
  215. package/lib-esm/Timeline.d.ts +1 -0
  216. package/lib-esm/Timeline.js +17 -12
  217. package/lib-esm/Token/Token.d.ts +7 -0
  218. package/lib-esm/Token/Token.js +44 -0
  219. package/lib-esm/Token/TokenBase.d.ts +16 -0
  220. package/lib-esm/Token/TokenBase.js +56 -0
  221. package/lib-esm/Token/TokenLabel.d.ts +10 -0
  222. package/lib-esm/Token/TokenLabel.js +99 -0
  223. package/lib-esm/Token/TokenProfile.d.ts +7 -0
  224. package/lib-esm/Token/TokenProfile.js +28 -0
  225. package/lib-esm/Token/_RemoveTokenButton.d.ts +3 -0
  226. package/lib-esm/Token/_RemoveTokenButton.js +28 -0
  227. package/lib-esm/Token/_tokenButtonUtils.d.ts +9 -0
  228. package/lib-esm/Token/_tokenButtonUtils.js +26 -0
  229. package/lib-esm/Tooltip.js +1 -1
  230. package/lib-esm/UnderlineNav.js +2 -2
  231. package/lib-esm/_UnstyledTextInput.d.ts +2 -0
  232. package/lib-esm/_UnstyledTextInput.js +7 -0
  233. package/lib-esm/hooks/useOverlay.d.ts +2 -1
  234. package/lib-esm/hooks/useOverlay.js +11 -6
  235. package/lib-esm/index.d.ts +2 -3
  236. package/lib-esm/index.js +2 -3
  237. package/lib-esm/theme-preval.d.ts +6 -12
  238. package/lib-esm/theme-preval.js +0 -940
  239. package/lib-esm/utils/scrollIntoViewingArea.d.ts +1 -0
  240. package/lib-esm/utils/scrollIntoViewingArea.js +30 -0
  241. package/lib-esm/utils/testing.d.ts +0 -1854
  242. package/lib-esm/utils/types.d.ts +3 -0
  243. package/lib-esm/utils/uniqueId.js +0 -1
  244. package/package.json +13 -14
  245. package/lib/Breadcrumbs.d.ts +0 -40
  246. package/lib/utils/ssr.d.ts +0 -1
  247. package/lib/utils/ssr.js +0 -19
  248. package/lib-esm/Breadcrumbs.d.ts +0 -40
  249. package/lib-esm/utils/ssr.d.ts +0 -1
  250. package/lib-esm/utils/ssr.js +0 -1
@@ -0,0 +1,227 @@
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: "TextInputTokens__InputWrapper",
38
+ componentId: "sc-1k54xiz-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 handleTokenRemove = tokenId => {
68
+ onTokenRemove(tokenId);
69
+ };
70
+
71
+ const handleTokenFocus = tokenIdx => () => {
72
+ setSelectedTokenIdx(tokenIdx);
73
+ };
74
+
75
+ const handleTokenBlur = () => {
76
+ setSelectedTokenIdx(undefined);
77
+ };
78
+
79
+ const handleTokenKeyUp = tokenId => e => {
80
+ if (e.key === 'Backspace') {
81
+ handleTokenRemove(tokenId);
82
+ }
83
+
84
+ if (e.key === 'Escape') {
85
+ var _ref$current;
86
+
87
+ ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
88
+ }
89
+ };
90
+
91
+ const handleInputFocus = e => {
92
+ onFocus && onFocus(e);
93
+ setSelectedTokenIdx(undefined);
94
+ };
95
+
96
+ const handleInputKeyDown = e => {
97
+ var _ref$current2;
98
+
99
+ if (onKeyDown) {
100
+ onKeyDown(e);
101
+ }
102
+
103
+ if (ref !== null && ref !== void 0 && (_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.value) {
104
+ return;
105
+ }
106
+
107
+ const lastToken = tokens[tokens.length - 1];
108
+
109
+ if (e.key === 'Backspace' && lastToken) {
110
+ handleTokenRemove(lastToken.id);
111
+
112
+ if (ref !== null && ref !== void 0 && ref.current) {
113
+ // TODO: eliminate the first hack by making changes to the Autocomplete component
114
+ // COLEHELP
115
+ //
116
+ // HACKS:
117
+ // 1. Directly setting `ref.current.value` instead of updating state because the autocomplete
118
+ // highlight behavior doesn't work correctly if we update the value with a setState action in onChange
119
+ // 2. Adding an extra space so that when I backspace, it doesn't delete the last letter
120
+ ref.current.value = `${lastToken.text} `;
121
+ } // HACK: for some reason we need to wait a tick for `.select()` to work
122
+
123
+
124
+ setTimeout(() => {
125
+ var _ref$current3;
126
+
127
+ ref === null || ref === void 0 ? void 0 : (_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.select();
128
+ }, 1);
129
+ }
130
+ };
131
+
132
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(InputWrapper, null, /*#__PURE__*/_react.default.createElement(_UnstyledTextInput.default, _extends({
133
+ ref: ref,
134
+ disabled: disabled,
135
+ onFocus: handleInputFocus,
136
+ onKeyDown: handleInputKeyDown,
137
+ type: "text",
138
+ sx: {
139
+ height: '100%'
140
+ }
141
+ }, inputPropsRest))), tokens !== null && tokens !== void 0 && tokens.length && TokenComponent ? tokens.map(({
142
+ id,
143
+ ...tokenRest
144
+ }, i) => /*#__PURE__*/_react.default.createElement(TokenComponent, _extends({
145
+ onFocus: handleTokenFocus(i),
146
+ onBlur: handleTokenBlur,
147
+ onKeyUp: handleTokenKeyUp(id),
148
+ isSelected: selectedTokenIdx === i,
149
+ handleRemove: !hideTokenRemoveButtons ? () => {
150
+ handleTokenRemove(id);
151
+ } : undefined,
152
+ variant: tokenSizeVariant,
153
+ tabIndex: 0
154
+ }, tokenRest))) : null);
155
+ });
156
+
157
+ const TextInputWithTokens = /*#__PURE__*/_react.default.forwardRef(({
158
+ tokens,
159
+ sx: sxProp,
160
+ ...props
161
+ }, ref) => {
162
+ const localInputRef = (0, _react.useRef)(null);
163
+ const combinedInputRef = (0, _useCombinedRefs.useCombinedRefs)(localInputRef, ref);
164
+ const [selectedTokenIdx, setSelectedTokenIdx] = (0, _react.useState)();
165
+ const {
166
+ containerRef
167
+ } = (0, _useFocusZone.useFocusZone)({
168
+ focusOutBehavior: 'wrap',
169
+ bindKeys: _focusZone.FocusKeys.ArrowHorizontal | _focusZone.FocusKeys.HomeAndEnd,
170
+ focusableElementFilter: element => {
171
+ return !(element instanceof HTMLButtonElement);
172
+ },
173
+ getNextFocusable: direction => {
174
+ var _containerRef$current;
175
+
176
+ if (!selectedTokenIdx && selectedTokenIdx !== 0) {
177
+ return undefined;
178
+ }
179
+
180
+ let nextIndex = selectedTokenIdx + 1;
181
+
182
+ if (direction === 'next') {
183
+ nextIndex += 1;
184
+ }
185
+
186
+ if (direction === 'previous') {
187
+ nextIndex -= 1;
188
+ }
189
+
190
+ if (nextIndex > tokens.length || nextIndex < 1) {
191
+ return combinedInputRef.current || undefined;
192
+ }
193
+
194
+ return containerRef === null || containerRef === void 0 ? void 0 : (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.children[nextIndex];
195
+ }
196
+ }, [selectedTokenIdx]);
197
+ return /*#__PURE__*/_react.default.createElement(_TextInput.default, _extends({
198
+ ref: combinedInputRef,
199
+ wrapperRef: containerRef,
200
+ as: TextInputWithTokensComponent,
201
+ selectedTokenIdx: selectedTokenIdx,
202
+ setSelectedTokenIdx: setSelectedTokenIdx,
203
+ tokens: tokens,
204
+ sx: {
205
+ 'alignItems': props.preventTokenWrapping ? 'center' : undefined,
206
+ 'flexWrap': props.preventTokenWrapping ? 'nowrap' : 'wrap',
207
+ 'gap': '0.25rem',
208
+ '> *': {
209
+ 'flexShrink': 0
210
+ },
211
+ ...(props.block ? {
212
+ display: 'flex',
213
+ width: '100%'
214
+ } : {}),
215
+ ...sxProp
216
+ }
217
+ }, props));
218
+ });
219
+
220
+ TextInputWithTokens.defaultProps = {
221
+ tokenComponent: _Token.default,
222
+ tokenSizeVariant: "xl",
223
+ hideTokenRemoveButtons: false
224
+ };
225
+ TextInputWithTokens.displayName = 'TextInputWithTokens';
226
+ var _default = TextInputWithTokens;
227
+ exports.default = _default;
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { MaxWidthProps, MinWidthProps, WidthProps } from 'styled-system';
3
+ import { ItemProps } from './ActionList';
4
+ import { ItemInput } from './ActionList/List';
5
+ import { SystemCommonProps } from './constants';
6
+ import { SxProp } from './sx';
7
+ import { ComponentProps } from './utils/types';
8
+ import Token from './Token/Token';
9
+ declare const Input: import("styled-components").StyledComponent<"input", any, {}, never>;
10
+ declare const Wrapper: import("styled-components").StyledComponent<"span", any, {
11
+ disabled?: boolean | undefined;
12
+ hasIcon?: boolean | undefined;
13
+ block?: boolean | undefined;
14
+ contrast?: boolean | undefined;
15
+ variant?: "large" | "small" | undefined;
16
+ maxHeight?: React.CSSProperties['maxHeight'];
17
+ } & SystemCommonProps & WidthProps<Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>, import("csstype").Property.Width<import("styled-system").TLengthStyledSystem>> & MinWidthProps<Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>, import("csstype").Property.MinWidth<import("styled-system").TLengthStyledSystem>> & MaxWidthProps<Required<import("styled-system").Theme<import("styled-system").TLengthStyledSystem>>, import("csstype").Property.MaxWidth<import("styled-system").TLengthStyledSystem>> & SxProp, never>;
18
+ interface Token {
19
+ text?: string;
20
+ id: string | number;
21
+ }
22
+ declare type TextInputWithTokensInternalProps = {
23
+ as?: any;
24
+ icon?: React.ComponentType<{
25
+ className?: string;
26
+ }>;
27
+ tokens: Token[];
28
+ onTokenRemove: (tokenId: string | number) => void;
29
+ selectableItems: ItemInput[];
30
+ onFilterChange: (value: string, e: React.ChangeEvent<HTMLInputElement>) => void;
31
+ onItemSelect: NonNullable<ItemProps['onAction']>;
32
+ tokenComponent?: React.FunctionComponent<any>;
33
+ emptyStateText?: React.ReactNode | false;
34
+ addNewTokenItem?: Omit<ItemInput, 'onAction'>;
35
+ onCloseOptionsList?: () => void;
36
+ maxHeight?: React.CSSProperties['maxHeight'];
37
+ loading?: boolean;
38
+ } & ComponentProps<typeof Wrapper> & ComponentProps<typeof Input>;
39
+ declare const TextInputWithTokens: React.ForwardRefExoticComponent<Pick<TextInputWithTokensInternalProps, "backgroundColor" | "color" | "display" | "height" | "marginBottom" | "marginLeft" | "marginRight" | "marginTop" | "maxHeight" | "maxWidth" | "minWidth" | "opacity" | "paddingBottom" | "paddingLeft" | "paddingRight" | "paddingTop" | "translate" | "width" | "margin" | "padding" | "hidden" | "children" | "theme" | "value" | "form" | "p" | "slot" | "style" | "title" | "pattern" | "list" | "type" | "name" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "css" | "block" | "bg" | "m" | "mt" | "mr" | "mb" | "ml" | "mx" | "marginX" | "my" | "marginY" | "pt" | "pr" | "pb" | "pl" | "px" | "paddingX" | "py" | "paddingY" | "step" | "size" | "icon" | "sx" | "max" | "min" | "crossOrigin" | "alt" | "src" | "autoFocus" | "disabled" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "autoComplete" | "loading" | "accept" | "capture" | "checked" | "enterKeyHint" | "maxLength" | "minLength" | "multiple" | "readOnly" | "required" | "as" | "variant" | "hasIcon" | "contrast" | "onItemSelect" | "emptyStateText" | "onFilterChange" | "tokens" | "onTokenRemove" | "tokenComponent" | "selectableItems" | "addNewTokenItem" | "onCloseOptionsList"> & React.RefAttributes<HTMLInputElement>>;
40
+ export declare type TextInputWithTokensProps = ComponentProps<typeof TextInputWithTokens>;
41
+ export default TextInputWithTokens;
@@ -0,0 +1,396 @@
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 _classnames = _interopRequireDefault(require("classnames"));
13
+
14
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
15
+
16
+ var _styledSystem = require("styled-system");
17
+
18
+ var _ActionList = require("./ActionList");
19
+
20
+ var _focusZone = require("./behaviors/focusZone");
21
+
22
+ var _constants = require("./constants");
23
+
24
+ var _hooks = require("./hooks");
25
+
26
+ var _useCombinedRefs = require("./hooks/useCombinedRefs");
27
+
28
+ var _useFocusZone = require("./hooks/useFocusZone");
29
+
30
+ var _Overlay = _interopRequireDefault(require("./Overlay"));
31
+
32
+ var _sx = _interopRequireDefault(require("./sx"));
33
+
34
+ var _Token = _interopRequireDefault(require("./Token/Token"));
35
+
36
+ var _ = require(".");
37
+
38
+ var _Portal = require("./Portal");
39
+
40
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
+
42
+ 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); }
43
+
44
+ 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; }
45
+
46
+ 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); }
47
+
48
+ const DROPDOWN_PORTAL_CONTAINER_NAME = '__listcontainerportal__';
49
+
50
+ function scrollIntoViewingArea(child, container, margin = 8, behavior = 'smooth') {
51
+ const {
52
+ top: childTop,
53
+ bottom: childBottom
54
+ } = child.getBoundingClientRect();
55
+ const {
56
+ top: containerTop,
57
+ bottom: containerBottom
58
+ } = container.getBoundingClientRect();
59
+ const isChildTopAboveViewingArea = childTop < containerTop + margin;
60
+ const isChildBottomBelowViewingArea = childBottom > containerBottom - margin;
61
+
62
+ if (isChildTopAboveViewingArea) {
63
+ const scrollHeightToChildTop = childTop - containerTop + container.scrollTop;
64
+ container.scrollTo({
65
+ behavior,
66
+ top: scrollHeightToChildTop - margin
67
+ });
68
+ } else if (isChildBottomBelowViewingArea) {
69
+ const scrollHeightToChildBottom = childBottom - containerBottom + container.scrollTop;
70
+ container.scrollTo({
71
+ behavior,
72
+ top: scrollHeightToChildBottom + margin
73
+ });
74
+ } // either completely in view or outside viewing area on both ends, don't scroll
75
+
76
+ }
77
+
78
+ const sizeVariants = (0, _styledSystem.variant)({
79
+ variants: {
80
+ small: {
81
+ minHeight: '28px',
82
+ px: 2,
83
+ py: '3px',
84
+ fontSize: 0,
85
+ lineHeight: '20px'
86
+ },
87
+ large: {
88
+ px: 2,
89
+ py: '10px',
90
+ fontSize: 3
91
+ }
92
+ }
93
+ });
94
+
95
+ const Input = _styledComponents.default.input.withConfig({
96
+ displayName: "TextInputWithTokens__Input",
97
+ componentId: "sc-8z94t5-0"
98
+ })(["border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;height:100%;width:100%;padding:0;&:focus{outline:0;}"]);
99
+
100
+ const InputWrapper = _styledComponents.default.div.withConfig({
101
+ displayName: "TextInputWithTokens__InputWrapper",
102
+ componentId: "sc-8z94t5-1"
103
+ })(["position:relative;order:1;flex-grow:1;&:after{content:attr(data-autocompleteSuggestion);pointer-events:none;display:flex;align-items:center;position:absolute;left:0;top:1px;width:100%;height:100%;display:flex;align-items:center;color:rgba(0,0,0,0.5);}"]);
104
+
105
+ const Wrapper = _styledComponents.default.span.withConfig({
106
+ displayName: "TextInputWithTokens__Wrapper",
107
+ componentId: "sc-8z94t5-2"
108
+ })(["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:", ";flex-wrap:wrap;gap:0.25rem;", " ", " .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.text.primary'), (0, _constants.get)('colors.border.primary'), (0, _constants.get)('radii.2'), (0, _constants.get)('shadows.shadow.inset'), props => {
109
+ if (props.hasIcon) {
110
+ return (0, _styledComponents.css)(["padding:0;"]);
111
+ } else {
112
+ return (0, _styledComponents.css)(["padding:6px 12px;"]);
113
+ }
114
+ }, props => {
115
+ if (props.maxHeight) {
116
+ return (0, _styledComponents.css)(["max-height:", ";overflow:auto;"], props.maxHeight);
117
+ }
118
+ }, (0, _constants.get)('colors.icon.tertiary'), (0, _constants.get)('space.2'), (0, _constants.get)('colors.state.focus.border'), (0, _constants.get)('shadows.state.focus.shadow'), props => props.contrast && (0, _styledComponents.css)(["background-color:", ";"], (0, _constants.get)('colors.input.contrastBg')), props => props.disabled && (0, _styledComponents.css)(["color:", ";background-color:", ";border-color:", ";"], (0, _constants.get)('colors.text.secondary'), (0, _constants.get)('colors.input.disabledBg'), (0, _constants.get)('colors.input.disabledBorder')), props => props.block && (0, _styledComponents.css)(["display:block;width:100%;"]), (0, _constants.get)('breakpoints.1'), (0, _constants.get)('fontSizes.1'), _constants.COMMON, _styledSystem.width, _styledSystem.minWidth, _styledSystem.maxWidth, sizeVariants, _sx.default);
119
+
120
+ // using forwardRef is important so that other components (ex. SelectMenu) can autofocus the input
121
+ const TextInputWithTokens = /*#__PURE__*/_react.default.forwardRef(({
122
+ icon: IconComponent,
123
+ contrast,
124
+ className,
125
+ block,
126
+ disabled,
127
+ theme,
128
+ sx: sxProp,
129
+ tokens,
130
+ selectableItems,
131
+ onFilterChange,
132
+ onItemSelect,
133
+ onTokenRemove,
134
+ tokenComponent: TokenComponent,
135
+ emptyStateText,
136
+ addNewTokenItem,
137
+ onCloseOptionsList,
138
+ loading,
139
+ ...rest
140
+ }, ref) => {
141
+ const listContainerRef = (0, _react.useRef)(null);
142
+ const localInputRef = (0, _react.useRef)(null);
143
+ const scrollContainerRef = (0, _react.useRef)(null);
144
+ const activeDescendantRef = (0, _react.useRef)();
145
+ const combinedInputRef = (0, _useCombinedRefs.useCombinedRefs)(localInputRef, ref); // this class is necessary to style FilterSearch, plz no touchy!
146
+
147
+ const wrapperClasses = (0, _classnames.default)(className, 'TextInput-wrapper');
148
+ const wrapperProps = (0, _props.pick)(rest);
149
+ const inputProps = (0, _props.omit)(rest);
150
+ const [selectedTokenIdx, setSelectedTokenIdx] = (0, _react.useState)();
151
+ const [inputVal, setInputVal] = (0, _react.useState)('');
152
+ const [showMenu, setShowMenu] = (0, _react.useState)(false);
153
+ const [selectedItems, setSelectedItems] = (0, _react.useState)(tokens.map(({
154
+ id,
155
+ text
156
+ }) => ({
157
+ id,
158
+ text
159
+ })));
160
+ const [autocompleteSuggestion, setAutocompleteSuggestion] = (0, _react.useState)('');
161
+ const [highlightedItem, setHighlightedItem] = (0, _react.useState)();
162
+ const {
163
+ containerRef
164
+ } = (0, _useFocusZone.useFocusZone)({
165
+ focusOutBehavior: 'wrap',
166
+ bindKeys: _focusZone.FocusKeys.ArrowHorizontal | _focusZone.FocusKeys.HomeAndEnd,
167
+ focusableElementFilter: element => {
168
+ return !(element instanceof HTMLButtonElement);
169
+ }
170
+ });
171
+ const {
172
+ floatingElementRef,
173
+ position
174
+ } = (0, _hooks.useAnchoredPosition)({
175
+ side: 'outside-bottom',
176
+ align: 'start',
177
+ anchorElementRef: combinedInputRef
178
+ }, [showMenu, tokens]);
179
+
180
+ const closeOptionList = () => {
181
+ setShowMenu(false);
182
+
183
+ if (onCloseOptionsList) {
184
+ onCloseOptionsList();
185
+ }
186
+ };
187
+
188
+ const showOptionList = () => {
189
+ setShowMenu(true);
190
+ };
191
+
192
+ const handleTokenRemove = tokenId => {
193
+ onTokenRemove(tokenId);
194
+ setSelectedItems(selectedItems.filter(selectedItem => selectedItem.id !== tokenId));
195
+ };
196
+
197
+ const handleTokenFocus = tokenIdx => () => {
198
+ setSelectedTokenIdx(tokenIdx);
199
+ closeOptionList();
200
+ };
201
+
202
+ const handleTokenBlur = () => {
203
+ setSelectedTokenIdx(undefined);
204
+ };
205
+
206
+ const handleTokenKeyUp = tokenId => e => {
207
+ if (e.key === 'Backspace') {
208
+ handleTokenRemove(tokenId);
209
+ }
210
+
211
+ if (e.key === 'Escape') {
212
+ var _combinedInputRef$cur;
213
+
214
+ combinedInputRef === null || combinedInputRef === void 0 ? void 0 : (_combinedInputRef$cur = combinedInputRef.current) === null || _combinedInputRef$cur === void 0 ? void 0 : _combinedInputRef$cur.focus();
215
+ }
216
+ };
217
+
218
+ const handleInputFocus = () => {
219
+ setSelectedTokenIdx(undefined);
220
+ showOptionList();
221
+ };
222
+
223
+ const handleInputChange = e => {
224
+ onFilterChange(e.currentTarget.value, e);
225
+ setInputVal(e.currentTarget.value);
226
+ };
227
+
228
+ const handleInputKeyDown = e => {
229
+ if (e.key === 'ArrowRight' && autocompleteSuggestion) {
230
+ setInputVal(autocompleteSuggestion); // TODO: use hooks or something to always trigger `onFilterChange` when `inputVal` is changed
231
+
232
+ onFilterChange(autocompleteSuggestion, e);
233
+ }
234
+
235
+ if (inputVal) {
236
+ return;
237
+ }
238
+
239
+ const lastToken = tokens[tokens.length - 1];
240
+
241
+ if (e.key === 'Backspace') {
242
+ handleTokenRemove(lastToken.id);
243
+ setInputVal(`${lastToken.text}` || ''); // TODO: use hooks or something to always trigger `onFilterChange` when `inputVal` is changed
244
+
245
+ onFilterChange(lastToken.text || '', e); // HACK: for some reason we need to wait a tick for `.select()` to work
246
+
247
+ setTimeout(() => {
248
+ var _combinedInputRef$cur2;
249
+
250
+ combinedInputRef === null || combinedInputRef === void 0 ? void 0 : (_combinedInputRef$cur2 = combinedInputRef.current) === null || _combinedInputRef$cur2 === void 0 ? void 0 : _combinedInputRef$cur2.select();
251
+ }, 1);
252
+ }
253
+ };
254
+
255
+ const onInputKeyPress = (0, _react.useCallback)(event => {
256
+ if (event.key === 'Enter' && activeDescendantRef.current) {
257
+ event.preventDefault();
258
+ event.nativeEvent.stopImmediatePropagation(); // Forward Enter key press to active descendant so that item gets activated
259
+
260
+ const activeDescendantEvent = new KeyboardEvent(event.type, event.nativeEvent);
261
+ activeDescendantRef.current.dispatchEvent(activeDescendantEvent);
262
+ }
263
+ }, [activeDescendantRef]);
264
+
265
+ const getSelectedItems = (itemId, checked) => {
266
+ const newlySelectedItem = selectableItems.find(item => item.id === itemId);
267
+
268
+ if (checked) {
269
+ return [...selectedItems, ...(newlySelectedItem ? [newlySelectedItem] : [])];
270
+ }
271
+
272
+ return selectedItems.filter(selectedChoice => selectedChoice.id !== itemId);
273
+ };
274
+
275
+ const itemsToRender = [// selectable tokens
276
+ ...selectableItems.map(selectableItem => ({ ...selectableItem,
277
+ selected: selectableItem.selected || selectedItems.map(item => item.id).includes(selectableItem.id),
278
+ onAction: (item, e) => {
279
+ setSelectedItems(getSelectedItems(item.id, !item.selected) || []);
280
+
281
+ if (!item.selected) {
282
+ onItemSelect(item, e);
283
+ setInputVal('');
284
+ setAutocompleteSuggestion('');
285
+ } else {
286
+ handleTokenRemove(item.id !== null && item.id !== undefined ? item.id : '');
287
+ }
288
+ }
289
+ })), // menu item used for creating a token from whatever is in the text input
290
+ ...(addNewTokenItem ? [{ ...addNewTokenItem,
291
+ onAction: (_item, e) => {
292
+ onItemSelect({
293
+ text: inputVal,
294
+ id: `randomlyGeneratedId-${inputVal}`
295
+ }, e);
296
+ }
297
+ }] : [])];
298
+ (0, _useFocusZone.useFocusZone)({
299
+ containerRef: listContainerRef,
300
+ focusOutBehavior: 'wrap',
301
+ focusableElementFilter: element => {
302
+ return !(element instanceof HTMLInputElement);
303
+ },
304
+ activeDescendantFocus: combinedInputRef,
305
+ onActiveDescendantChanged: (current, _previous, directlyActivated) => {
306
+ activeDescendantRef.current = current;
307
+ const selectedItem = itemsToRender.find(item => {
308
+ var _item$id;
309
+
310
+ return ((_item$id = item.id) === null || _item$id === void 0 ? void 0 : _item$id.toString()) === (current === null || current === void 0 ? void 0 : current.dataset.id);
311
+ });
312
+ setHighlightedItem(selectedItem);
313
+
314
+ if (current && scrollContainerRef.current && directlyActivated) {
315
+ scrollIntoViewingArea(current, scrollContainerRef.current);
316
+ }
317
+ }
318
+ });
319
+ (0, _react.useEffect)(() => {
320
+ var _highlightedItem$text;
321
+
322
+ if (highlightedItem !== null && highlightedItem !== void 0 && (_highlightedItem$text = highlightedItem.text) !== null && _highlightedItem$text !== void 0 && _highlightedItem$text.startsWith(inputVal)) {
323
+ setAutocompleteSuggestion(highlightedItem.text);
324
+ } else {
325
+ setAutocompleteSuggestion('');
326
+ }
327
+ }, [highlightedItem, inputVal]);
328
+
329
+ if (listContainerRef.current) {
330
+ (0, _Portal.registerPortalRoot)(listContainerRef.current, DROPDOWN_PORTAL_CONTAINER_NAME);
331
+ }
332
+
333
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Wrapper, _extends({
334
+ className: wrapperClasses,
335
+ hasIcon: !!IconComponent,
336
+ block: block,
337
+ theme: theme,
338
+ disabled: disabled,
339
+ contrast: contrast,
340
+ sx: sxProp,
341
+ ref: containerRef
342
+ }, wrapperProps), /*#__PURE__*/_react.default.createElement(InputWrapper, {
343
+ "data-autocompleteSuggestion": autocompleteSuggestion
344
+ }, /*#__PURE__*/_react.default.createElement(Input, _extends({
345
+ ref: combinedInputRef,
346
+ disabled: disabled,
347
+ onFocus: handleInputFocus,
348
+ onKeyPress: onInputKeyPress,
349
+ onKeyDown: handleInputKeyDown,
350
+ onChange: handleInputChange,
351
+ type: "text",
352
+ value: inputVal
353
+ }, inputProps))), tokens !== null && tokens !== void 0 && tokens.length && TokenComponent ? tokens.map((token, i) => /*#__PURE__*/_react.default.createElement(TokenComponent, {
354
+ onFocus: handleTokenFocus(i),
355
+ onBlur: handleTokenBlur,
356
+ onKeyUp: handleTokenKeyUp(token.id),
357
+ text: token.text || '' // TODO: just make token.text required
358
+ ,
359
+ isSelected: selectedTokenIdx === i,
360
+ handleRemove: () => {
361
+ handleTokenRemove(token.id);
362
+ },
363
+ variant: "xl",
364
+ fillColor: token.labelColor ? token.labelColor : undefined,
365
+ tabIndex: 0
366
+ })) : null), /*#__PURE__*/_react.default.createElement("div", {
367
+ ref: listContainerRef
368
+ }, showMenu && emptyStateText ? /*#__PURE__*/_react.default.createElement(_Overlay.default, {
369
+ returnFocusRef: combinedInputRef,
370
+ portalContainerName: DROPDOWN_PORTAL_CONTAINER_NAME,
371
+ preventFocusOnOpen: true,
372
+ onClickOutside: closeOptionList,
373
+ onEscape: closeOptionList,
374
+ ref: floatingElementRef,
375
+ top: position === null || position === void 0 ? void 0 : position.top,
376
+ left: position === null || position === void 0 ? void 0 : position.left
377
+ }, loading ? /*#__PURE__*/_react.default.createElement(_.Box, {
378
+ p: 3,
379
+ display: "flex",
380
+ justifyContent: "center"
381
+ }, /*#__PURE__*/_react.default.createElement(_.Spinner, null)) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, itemsToRender.length ? /*#__PURE__*/_react.default.createElement(_ActionList.ActionList, {
382
+ selectionVariant: "multiple",
383
+ items: itemsToRender,
384
+ role: "listbox"
385
+ }) : /*#__PURE__*/_react.default.createElement(_.Box, {
386
+ p: 3
387
+ }, emptyStateText))) : null));
388
+ });
389
+
390
+ TextInputWithTokens.defaultProps = {
391
+ tokenComponent: _Token.default,
392
+ emptyStateText: 'No selectable options'
393
+ };
394
+ TextInputWithTokens.displayName = 'TextInputWithTokens';
395
+ var _default = TextInputWithTokens;
396
+ exports.default = _default;