@primer/components 30.3.0-rc.2010c7d4 → 31.0.0-rc.15aa0a10

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 (180) hide show
  1. package/.eslintrc.json +2 -1
  2. package/.storybook/preview.js +4 -4
  3. package/CHANGELOG.md +12 -2
  4. package/codemods/deprecateUtilityComponents.js +1 -1
  5. package/contributor-docs/adrs/adr-003-prop-norms.md +72 -0
  6. package/dist/browser.esm.js +798 -794
  7. package/dist/browser.esm.js.map +1 -1
  8. package/dist/browser.umd.js +801 -797
  9. package/dist/browser.umd.js.map +1 -1
  10. package/docs/content/Autocomplete.mdx +627 -0
  11. package/docs/content/TextInputTokens.mdx +89 -0
  12. package/docs/content/getting-started.md +1 -1
  13. package/docs/content/overriding-styles.mdx +7 -6
  14. package/docs/content/theming.md +5 -5
  15. package/docs/package-lock.json +288 -511
  16. package/docs/package.json +1 -1
  17. package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +14 -12
  18. package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +2 -0
  19. package/docs/src/@primer/gatsby-theme-doctocat/primer-components-hero.svg +7 -7
  20. package/lib/ActionList/Item.js +1 -1
  21. package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +2 -1
  22. package/lib/AnchoredOverlay/AnchoredOverlay.js +11 -3
  23. package/lib/Autocomplete/Autocomplete.d.ts +304 -0
  24. package/lib/Autocomplete/Autocomplete.js +145 -0
  25. package/lib/Autocomplete/AutocompleteContext.d.ts +17 -0
  26. package/lib/Autocomplete/AutocompleteContext.js +11 -0
  27. package/lib/Autocomplete/AutocompleteInput.d.ts +292 -0
  28. package/lib/Autocomplete/AutocompleteInput.js +157 -0
  29. package/lib/Autocomplete/AutocompleteMenu.d.ts +72 -0
  30. package/lib/Autocomplete/AutocompleteMenu.js +224 -0
  31. package/lib/Autocomplete/AutocompleteOverlay.d.ts +20 -0
  32. package/lib/Autocomplete/AutocompleteOverlay.js +80 -0
  33. package/lib/Autocomplete/index.d.ts +2 -0
  34. package/lib/Autocomplete/index.js +15 -0
  35. package/lib/BaseStyles.js +1 -1
  36. package/lib/BorderBox.js +1 -1
  37. package/lib/Button/ButtonInvisible.js +1 -1
  38. package/lib/Caret.js +2 -2
  39. package/lib/Dialog.js +1 -1
  40. package/lib/FilteredActionList/FilteredActionList.js +5 -31
  41. package/lib/Flash.js +16 -16
  42. package/lib/Label.js +1 -1
  43. package/lib/Overlay.d.ts +1 -0
  44. package/lib/Overlay.js +3 -1
  45. package/lib/ProgressBar.js +1 -1
  46. package/lib/StateLabel.js +13 -19
  47. package/lib/Token/_RemoveTokenButton.js +1 -1
  48. package/lib/__tests__/Autocomplete.test.d.ts +1 -0
  49. package/lib/__tests__/Autocomplete.test.js +528 -0
  50. package/lib/__tests__/BorderBox.test.js +1 -1
  51. package/lib/__tests__/CircleOcticon.test.js +1 -1
  52. package/lib/__tests__/CounterLabel.test.js +4 -4
  53. package/lib/__tests__/Flash.test.js +4 -4
  54. package/lib/__tests__/Link.test.js +1 -1
  55. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +1 -0
  56. package/lib/__tests__/behaviors/scrollIntoViewingArea.test.js +226 -0
  57. package/lib/behaviors/scrollIntoViewingArea.d.ts +1 -0
  58. package/lib/behaviors/scrollIntoViewingArea.js +39 -0
  59. package/lib/hooks/useOpenAndCloseFocus.d.ts +2 -1
  60. package/lib/hooks/useOpenAndCloseFocus.js +7 -2
  61. package/lib/hooks/useOverlay.d.ts +2 -1
  62. package/lib/hooks/useOverlay.js +4 -2
  63. package/lib/index.d.ts +2 -0
  64. package/lib/index.js +8 -0
  65. package/lib/stories/Autocomplete.stories.js +608 -0
  66. package/lib/stories/Dialog.stories.js +3 -3
  67. package/lib/stories/IssueLabelToken.stories.js +1 -1
  68. package/lib/stories/ProfileToken.stories.js +1 -1
  69. package/lib/theme-preval.js +370 -3100
  70. package/lib/utils/testing.d.ts +50 -493
  71. package/lib/utils/types/MandateProps.d.ts +3 -0
  72. package/lib/utils/types/MandateProps.js +1 -0
  73. package/lib/utils/types/index.d.ts +1 -0
  74. package/lib/utils/types/index.js +13 -0
  75. package/lib-esm/ActionList/Item.js +1 -1
  76. package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +2 -1
  77. package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +11 -3
  78. package/lib-esm/Autocomplete/Autocomplete.d.ts +304 -0
  79. package/lib-esm/Autocomplete/Autocomplete.js +123 -0
  80. package/lib-esm/Autocomplete/AutocompleteContext.d.ts +17 -0
  81. package/lib-esm/Autocomplete/AutocompleteContext.js +2 -0
  82. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +292 -0
  83. package/lib-esm/Autocomplete/AutocompleteInput.js +138 -0
  84. package/lib-esm/Autocomplete/AutocompleteMenu.d.ts +72 -0
  85. package/lib-esm/Autocomplete/AutocompleteMenu.js +205 -0
  86. package/lib-esm/Autocomplete/AutocompleteOverlay.d.ts +20 -0
  87. package/lib-esm/Autocomplete/AutocompleteOverlay.js +62 -0
  88. package/lib-esm/Autocomplete/index.d.ts +2 -0
  89. package/lib-esm/Autocomplete/index.js +1 -0
  90. package/lib-esm/BaseStyles.js +1 -1
  91. package/lib-esm/BorderBox.js +1 -1
  92. package/lib-esm/Button/ButtonInvisible.js +1 -1
  93. package/lib-esm/Caret.js +2 -2
  94. package/lib-esm/Dialog.js +1 -1
  95. package/lib-esm/FilteredActionList/FilteredActionList.js +3 -31
  96. package/lib-esm/Flash.js +16 -16
  97. package/lib-esm/Label.js +1 -1
  98. package/lib-esm/Overlay.d.ts +1 -0
  99. package/lib-esm/Overlay.js +3 -1
  100. package/lib-esm/ProgressBar.js +1 -1
  101. package/lib-esm/StateLabel.js +13 -19
  102. package/lib-esm/Token/_RemoveTokenButton.js +1 -1
  103. package/lib-esm/__tests__/Autocomplete.test.d.ts +1 -0
  104. package/lib-esm/__tests__/Autocomplete.test.js +494 -0
  105. package/lib-esm/__tests__/BorderBox.test.js +1 -1
  106. package/lib-esm/__tests__/CircleOcticon.test.js +1 -1
  107. package/lib-esm/__tests__/CounterLabel.test.js +4 -4
  108. package/lib-esm/__tests__/Flash.test.js +4 -4
  109. package/lib-esm/__tests__/Link.test.js +1 -1
  110. package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.d.ts +1 -0
  111. package/lib-esm/__tests__/behaviors/scrollIntoViewingArea.test.js +224 -0
  112. package/lib-esm/behaviors/scrollIntoViewingArea.d.ts +1 -0
  113. package/lib-esm/behaviors/scrollIntoViewingArea.js +30 -0
  114. package/lib-esm/hooks/useOpenAndCloseFocus.d.ts +2 -1
  115. package/lib-esm/hooks/useOpenAndCloseFocus.js +7 -2
  116. package/lib-esm/hooks/useOverlay.d.ts +2 -1
  117. package/lib-esm/hooks/useOverlay.js +4 -2
  118. package/lib-esm/index.d.ts +2 -0
  119. package/lib-esm/index.js +1 -0
  120. package/lib-esm/stories/Autocomplete.stories.js +549 -0
  121. package/lib-esm/stories/Dialog.stories.js +3 -3
  122. package/lib-esm/stories/IssueLabelToken.stories.js +1 -1
  123. package/lib-esm/stories/ProfileToken.stories.js +1 -1
  124. package/lib-esm/theme-preval.js +370 -3100
  125. package/lib-esm/utils/testing.d.ts +50 -493
  126. package/lib-esm/utils/types/MandateProps.d.ts +3 -0
  127. package/lib-esm/utils/types/MandateProps.js +1 -0
  128. package/lib-esm/utils/types/index.d.ts +1 -0
  129. package/lib-esm/utils/types/index.js +2 -1
  130. package/package-lock.json +11 -8
  131. package/package.json +3 -3
  132. package/src/ActionList/Item.tsx +1 -1
  133. package/src/AnchoredOverlay/AnchoredOverlay.tsx +14 -3
  134. package/src/Autocomplete/Autocomplete.tsx +103 -0
  135. package/src/Autocomplete/AutocompleteContext.tsx +19 -0
  136. package/src/Autocomplete/AutocompleteInput.tsx +179 -0
  137. package/src/Autocomplete/AutocompleteMenu.tsx +341 -0
  138. package/src/Autocomplete/AutocompleteOverlay.tsx +68 -0
  139. package/src/Autocomplete/index.ts +2 -0
  140. package/src/BaseStyles.tsx +1 -1
  141. package/src/BorderBox.tsx +1 -1
  142. package/src/Button/ButtonInvisible.tsx +7 -2
  143. package/src/Caret.tsx +2 -2
  144. package/src/Dialog.tsx +1 -1
  145. package/src/FilteredActionList/FilteredActionList.tsx +10 -25
  146. package/src/Flash.tsx +16 -16
  147. package/src/Label.tsx +1 -1
  148. package/src/Overlay.tsx +4 -1
  149. package/src/ProgressBar.tsx +1 -1
  150. package/src/StateLabel.tsx +12 -20
  151. package/src/Token/_RemoveTokenButton.tsx +4 -2
  152. package/src/__tests__/Autocomplete.test.tsx +444 -0
  153. package/src/__tests__/BorderBox.test.tsx +1 -1
  154. package/src/__tests__/CircleOcticon.test.tsx +1 -1
  155. package/src/__tests__/CounterLabel.test.tsx +4 -4
  156. package/src/__tests__/Flash.test.tsx +4 -4
  157. package/src/__tests__/Link.test.tsx +1 -1
  158. package/src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap +3 -3
  159. package/src/__tests__/__snapshots__/Autocomplete.test.tsx.snap +3414 -0
  160. package/src/__tests__/__snapshots__/Button.test.tsx.snap +9 -1
  161. package/src/__tests__/__snapshots__/ConfirmationDialog.test.tsx.snap +1 -1
  162. package/src/__tests__/__snapshots__/SelectPanel.test.tsx.snap +1 -1
  163. package/src/__tests__/__snapshots__/StateLabel.test.tsx.snap +0 -21
  164. package/src/__tests__/__snapshots__/TextInputWithTokens.test.tsx.snap +16 -16
  165. package/src/__tests__/__snapshots__/Token.test.tsx.snap +34 -34
  166. package/src/__tests__/behaviors/scrollIntoViewingArea.test.ts +195 -0
  167. package/src/behaviors/scrollIntoViewingArea.ts +27 -0
  168. package/src/hooks/useOpenAndCloseFocus.ts +7 -2
  169. package/src/hooks/useOverlay.tsx +4 -2
  170. package/src/index.ts +2 -0
  171. package/src/stories/Autocomplete.stories.tsx +572 -0
  172. package/src/stories/Dialog.stories.tsx +3 -3
  173. package/src/stories/IssueLabelToken.stories.tsx +1 -1
  174. package/src/stories/ProfileToken.stories.tsx +1 -1
  175. package/src/utils/types/MandateProps.ts +19 -0
  176. package/src/utils/types/index.ts +1 -0
  177. package/stats.html +1 -1
  178. package/docs/src/@primer/gatsby-theme-doctocat/components/live-code.js +0 -84
  179. package/docs/src/@primer/gatsby-theme-doctocat/components/nav-dropdown.js +0 -48
  180. package/docs/src/@primer/gatsby-theme-doctocat/components/wrap-page-element.js +0 -25
@@ -0,0 +1,549 @@
1
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ import React, { useCallback, useRef, useState } from 'react';
4
+ import { BaseStyles, Box, Text, TextInput, ThemeProvider } from '..';
5
+ import TextInputTokens from '../TextInputWithTokens';
6
+ import Autocomplete from '../Autocomplete/Autocomplete';
7
+ import { AnchoredOverlay } from '../AnchoredOverlay';
8
+ import { ButtonInvisible } from '../Button';
9
+ const items = [{
10
+ text: 'zero',
11
+ id: 0
12
+ }, {
13
+ text: 'one',
14
+ id: 1
15
+ }, {
16
+ text: 'two',
17
+ id: 2
18
+ }, {
19
+ text: 'three',
20
+ id: 3
21
+ }, {
22
+ text: 'four',
23
+ id: 4
24
+ }, {
25
+ text: 'five',
26
+ id: 5
27
+ }, {
28
+ text: 'six',
29
+ id: 6
30
+ }, {
31
+ text: 'seven',
32
+ id: 7
33
+ }, {
34
+ text: 'twenty',
35
+ id: 20
36
+ }, {
37
+ text: 'twentyone',
38
+ id: 21
39
+ }];
40
+ const mockTokens = [{
41
+ text: 'zero',
42
+ id: 0
43
+ }, {
44
+ text: 'one',
45
+ id: 1
46
+ }, {
47
+ text: 'three',
48
+ id: 3
49
+ }, {
50
+ text: 'four',
51
+ id: 4
52
+ }];
53
+ export default {
54
+ title: 'Forms/Autocomplete',
55
+ decorators: [Story => {
56
+ const [lastKey, setLastKey] = useState('none');
57
+ const reportKey = useCallback(event => {
58
+ setLastKey(event.key);
59
+ }, []);
60
+ return /*#__PURE__*/React.createElement(ThemeProvider, null, /*#__PURE__*/React.createElement(BaseStyles, null, /*#__PURE__*/React.createElement(Box, {
61
+ onKeyDownCapture: reportKey
62
+ }, /*#__PURE__*/React.createElement(Box, {
63
+ position: "absolute",
64
+ right: 5,
65
+ top: 2
66
+ }, "Last key pressed: ", lastKey), /*#__PURE__*/React.createElement(Box, {
67
+ paddingTop: 5
68
+ }, /*#__PURE__*/React.createElement(Story, null)))));
69
+ }]
70
+ };
71
+ export const SingleSelect = () => {
72
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
73
+ as: "label",
74
+ display: "block",
75
+ htmlFor: "autocompleteInput",
76
+ id: "autocompleteLabel"
77
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
78
+ id: "autocompleteInput"
79
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
80
+ items: items,
81
+ selectedItemIds: [],
82
+ "aria-labelledby": "autocompleteLabel"
83
+ }))));
84
+ };
85
+ export const MultiSelect = () => {
86
+ const [selectedItemIds, setSelectedItemIds] = useState([]);
87
+
88
+ const onSelectedChange = newlySelectedItems => {
89
+ if (!Array.isArray(newlySelectedItems)) {
90
+ return;
91
+ }
92
+
93
+ setSelectedItemIds(newlySelectedItems.map(item => item.id));
94
+ };
95
+
96
+ const getItemById = id => items.find(item => item.id === id);
97
+
98
+ return /*#__PURE__*/React.createElement(Box, {
99
+ display: "flex",
100
+ sx: {
101
+ gap: '1em'
102
+ }
103
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Box, {
104
+ as: "label",
105
+ display: "block",
106
+ htmlFor: "autocompleteInput",
107
+ id: "autocompleteLabel"
108
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
109
+ id: "autocompleteInput"
110
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
111
+ items: items,
112
+ selectedItemIds: selectedItemIds,
113
+ "aria-labelledby": "autocompleteLabel",
114
+ onSelectedChange: onSelectedChange,
115
+ selectionVariant: "multiple"
116
+ })))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, "Selected items:"), /*#__PURE__*/React.createElement(Box, {
117
+ as: "ul",
118
+ my: 0
119
+ }, selectedItemIds.map(selectedItemId => {
120
+ var _getItemById;
121
+
122
+ return /*#__PURE__*/React.createElement("li", {
123
+ key: selectedItemId
124
+ }, (_getItemById = getItemById(selectedItemId)) === null || _getItemById === void 0 ? void 0 : _getItemById.text);
125
+ }))));
126
+ };
127
+ MultiSelect.displayName = "MultiSelect";
128
+ export const MultiSelectWithTokenInput = () => {
129
+ const [tokens, setTokens] = useState(mockTokens);
130
+ const selectedTokenIds = tokens.map(token => token.id);
131
+ const [selectedItemIds, setSelectedItemIds] = useState(selectedTokenIds);
132
+
133
+ const onTokenRemove = tokenId => {
134
+ setTokens(tokens.filter(token => token.id !== tokenId));
135
+ setSelectedItemIds(selectedItemIds.filter(id => id !== tokenId));
136
+ };
137
+
138
+ const onSelectedChange = newlySelectedItems => {
139
+ if (!Array.isArray(newlySelectedItems)) {
140
+ return;
141
+ }
142
+
143
+ setSelectedItemIds(newlySelectedItems.map(item => item.id));
144
+
145
+ if (newlySelectedItems.length < selectedItemIds.length) {
146
+ const newlySelectedItemIds = newlySelectedItems.map(({
147
+ id
148
+ }) => id);
149
+ const removedItemIds = selectedTokenIds.filter(id => !newlySelectedItemIds.includes(id));
150
+
151
+ for (const removedItemId of removedItemIds) {
152
+ onTokenRemove(removedItemId);
153
+ }
154
+
155
+ return;
156
+ }
157
+
158
+ setTokens(newlySelectedItems.map(({
159
+ id,
160
+ text
161
+ }) => ({
162
+ id,
163
+ text
164
+ })));
165
+ };
166
+
167
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
168
+ as: "label",
169
+ display: "block",
170
+ htmlFor: "autocompleteInput",
171
+ id: "autocompleteLabel"
172
+ }, "Pick options"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
173
+ as: TextInputTokens,
174
+ tokens: tokens,
175
+ onTokenRemove: onTokenRemove,
176
+ id: "autocompleteInput"
177
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
178
+ items: items,
179
+ selectedItemIds: selectedItemIds,
180
+ onSelectedChange: onSelectedChange,
181
+ selectionVariant: "multiple",
182
+ "aria-labelledby": "autocompleteLabel"
183
+ }))));
184
+ };
185
+ export const MultiSelectAddNewItem = () => {
186
+ const [localItemsState, setLocalItemsState] = useState(items);
187
+ const [filterVal, setFilterVal] = useState('');
188
+ const [tokens, setTokens] = useState(mockTokens);
189
+ const selectedTokenIds = tokens.map(token => token.id);
190
+ const [selectedItemIds, setSelectedItemIds] = useState(selectedTokenIds);
191
+
192
+ const onTokenRemove = tokenId => {
193
+ setTokens(tokens.filter(token => token.id !== tokenId));
194
+ setSelectedItemIds(selectedItemIds.filter(id => id !== tokenId));
195
+ };
196
+
197
+ const onSelectedChange = newlySelectedItems => {
198
+ if (!Array.isArray(newlySelectedItems)) {
199
+ return;
200
+ }
201
+
202
+ setSelectedItemIds(newlySelectedItems.map(item => item.id));
203
+
204
+ if (newlySelectedItems.length < selectedItemIds.length) {
205
+ const newlySelectedItemIds = newlySelectedItems.map(({
206
+ id
207
+ }) => id);
208
+ const removedItemIds = selectedTokenIds.filter(id => !newlySelectedItemIds.includes(id));
209
+
210
+ for (const removedItemId of removedItemIds) {
211
+ onTokenRemove(removedItemId);
212
+ }
213
+
214
+ return;
215
+ }
216
+
217
+ setTokens(newlySelectedItems.map(({
218
+ id,
219
+ text
220
+ }) => ({
221
+ id,
222
+ text
223
+ })));
224
+ };
225
+
226
+ const onItemSelect = item => {
227
+ onSelectedChange([...selectedItemIds.map(id => items.find(selectedItem => selectedItem.id === id)), item]);
228
+
229
+ if (!localItemsState.some(localItem => localItem.id === item.id)) {
230
+ setLocalItemsState([...localItemsState, item]);
231
+ }
232
+ };
233
+
234
+ const handleChange = e => {
235
+ setFilterVal(e.currentTarget.value);
236
+ };
237
+
238
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
239
+ as: "label",
240
+ display: "block",
241
+ htmlFor: "autocompleteInput",
242
+ id: "autocompleteLabel"
243
+ }, "Pick options"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
244
+ as: TextInputTokens,
245
+ tokens: tokens,
246
+ onTokenRemove: onTokenRemove,
247
+ onChange: handleChange,
248
+ id: "autocompleteInput"
249
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
250
+ addNewItem: filterVal && !localItemsState.map(localItem => localItem.text).includes(filterVal) ? {
251
+ text: `Add '${filterVal}'`,
252
+ handleAddItem: item => {
253
+ onItemSelect({ ...item,
254
+ text: filterVal,
255
+ selected: true
256
+ });
257
+ setFilterVal('');
258
+ }
259
+ } : undefined,
260
+ items: localItemsState,
261
+ selectedItemIds: selectedItemIds,
262
+ onSelectedChange: onSelectedChange,
263
+ selectionVariant: "multiple",
264
+ "aria-labelledby": "autocompleteLabel"
265
+ }))));
266
+ };
267
+ export const CustomEmptyStateMessage = () => {
268
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
269
+ as: "label",
270
+ display: "block",
271
+ htmlFor: "autocompleteInput",
272
+ id: "autocompleteLabel"
273
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
274
+ id: "autocompleteInput"
275
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
276
+ items: items,
277
+ selectedItemIds: [],
278
+ "aria-labelledby": "autocompleteLabel",
279
+ emptyStateText: "Sorry, no matches"
280
+ }))));
281
+ };
282
+ export const CustomSearchFilter = () => {
283
+ const [filterVal, setFilterVal] = useState('');
284
+
285
+ const handleChange = e => {
286
+ setFilterVal(e.currentTarget.value);
287
+ };
288
+
289
+ const customFilterFn = item => item.text.includes(filterVal);
290
+
291
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
292
+ as: "label",
293
+ display: "block",
294
+ htmlFor: "autocompleteInput",
295
+ id: "autocompleteLabel"
296
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
297
+ id: "autocompleteInput",
298
+ onChange: handleChange
299
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
300
+ items: items,
301
+ selectedItemIds: [],
302
+ "aria-labelledby": "autocompleteLabel",
303
+ filterFn: customFilterFn
304
+ }))), /*#__PURE__*/React.createElement(Text, {
305
+ fontSize: 0,
306
+ display: "block",
307
+ color: "fg.subtle",
308
+ mt: 2
309
+ }, "Items in dropdown are filtered if their text has no part that matches the input value"));
310
+ };
311
+ export const CustomSortAfterMenuClose = () => {
312
+ const [selectedItemIds, setSelectedItemIds] = useState([]);
313
+
314
+ const isItemSelected = itemId => selectedItemIds.includes(itemId);
315
+
316
+ const onSelectedChange = newlySelectedItems => {
317
+ if (!Array.isArray(newlySelectedItems)) {
318
+ return;
319
+ }
320
+
321
+ setSelectedItemIds(newlySelectedItems.map(item => item.id));
322
+ };
323
+
324
+ const customSortFn = (itemIdA, itemIdB) => isItemSelected(itemIdA) === isItemSelected(itemIdB) ? 0 : isItemSelected(itemIdA) ? 1 : -1;
325
+
326
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
327
+ as: "label",
328
+ display: "block",
329
+ htmlFor: "autocompleteInput",
330
+ id: "autocompleteLabel"
331
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
332
+ id: "autocompleteInput"
333
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
334
+ items: items,
335
+ selectedItemIds: selectedItemIds,
336
+ "aria-labelledby": "autocompleteLabel",
337
+ onSelectedChange: onSelectedChange,
338
+ sortOnCloseFn: customSortFn,
339
+ selectionVariant: "multiple"
340
+ }))), /*#__PURE__*/React.createElement(Text, {
341
+ fontSize: 0,
342
+ display: "block",
343
+ color: "fg.subtle",
344
+ mt: 2
345
+ }, "When the dropdown closes, selected items are sorted to the end"));
346
+ };
347
+ export const WithCallbackWhenOverlayOpenStateChanges = () => {
348
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
349
+
350
+ const onOpenChange = isOpen => {
351
+ setIsMenuOpen(isOpen);
352
+ };
353
+
354
+ return /*#__PURE__*/React.createElement(Box, {
355
+ display: "flex",
356
+ sx: {
357
+ gap: '1em'
358
+ }
359
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Box, {
360
+ as: "label",
361
+ display: "block",
362
+ htmlFor: "autocompleteInput",
363
+ id: "autocompleteLabel"
364
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
365
+ id: "autocompleteInput"
366
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
367
+ items: items,
368
+ selectedItemIds: [],
369
+ "aria-labelledby": "autocompleteLabel",
370
+ onOpenChange: onOpenChange
371
+ })))), /*#__PURE__*/React.createElement("div", null, "The menu is ", /*#__PURE__*/React.createElement("strong", null, isMenuOpen ? 'opened' : 'closed')));
372
+ };
373
+ WithCallbackWhenOverlayOpenStateChanges.displayName = "WithCallbackWhenOverlayOpenStateChanges";
374
+ export const AsyncLoadingOfItems = () => {
375
+ const [loadedItems, setLoadedItems] = useState([]);
376
+
377
+ const onOpenChange = () => {
378
+ setTimeout(() => {
379
+ setLoadedItems(items);
380
+ }, 1500);
381
+ };
382
+
383
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
384
+ as: "label",
385
+ display: "block",
386
+ htmlFor: "autocompleteInput",
387
+ id: "autocompleteLabel"
388
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
389
+ id: "autocompleteInput"
390
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, null, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
391
+ items: loadedItems,
392
+ selectedItemIds: [],
393
+ "aria-labelledby": "autocompleteLabel",
394
+ onOpenChange: onOpenChange,
395
+ loading: loadedItems.length === 0
396
+ }))));
397
+ };
398
+ export const RenderingTheMenuOutsideAnOverlay = () => {
399
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
400
+ as: "label",
401
+ display: "block",
402
+ htmlFor: "autocompleteInput",
403
+ id: "autocompleteLabel"
404
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
405
+ id: "autocompleteInput"
406
+ }), /*#__PURE__*/React.createElement(Autocomplete.Menu, {
407
+ items: items,
408
+ selectedItemIds: [],
409
+ "aria-labelledby": "autocompleteLabel"
410
+ })));
411
+ };
412
+ export const CustomOverlayMenuAnchor = () => {
413
+ const menuAnchorRef = useRef(null);
414
+ const anchorWrapperStyles = {
415
+ display: 'flex',
416
+ alignItems: 'center',
417
+ flexGrow: 1,
418
+ flexShrink: 0,
419
+ flexBasis: '25%',
420
+ border: '1px solid black',
421
+ padding: '1em'
422
+ };
423
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
424
+ as: "label",
425
+ htmlFor: "autocompleteInput",
426
+ id: "autocompleteLabel"
427
+ }, "Pick labels"), /*#__PURE__*/React.createElement(Box, _extends({}, anchorWrapperStyles, {
428
+ ref: menuAnchorRef
429
+ }), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
430
+ as: TextInput,
431
+ id: "autocompleteInput",
432
+ sx: {
433
+ border: '0',
434
+ padding: '0',
435
+ boxShadow: 'none',
436
+ ':focus-within': {
437
+ border: '0',
438
+ boxShadow: 'none'
439
+ }
440
+ }
441
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, {
442
+ menuAnchorRef: menuAnchorRef
443
+ }, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
444
+ items: items,
445
+ selectedItemIds: [],
446
+ "aria-labelledby": "autocompleteLabel"
447
+ })))), /*#__PURE__*/React.createElement(Text, {
448
+ fontSize: 0,
449
+ display: "block",
450
+ color: "fg.subtle",
451
+ mt: 2
452
+ }, "The overlay menu's position is anchored to the div with the black border instead of to the text input"));
453
+ };
454
+ export const WithCustomOverlayProps = () => {
455
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
456
+ as: "label",
457
+ display: "block",
458
+ htmlFor: "autocompleteInput",
459
+ id: "autocompleteLabel"
460
+ }, "Pick an option"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Autocomplete.Input, {
461
+ id: "autocompleteInput"
462
+ }), /*#__PURE__*/React.createElement(Autocomplete.Overlay, {
463
+ overlayProps: {
464
+ width: 'large',
465
+ height: 'xsmall'
466
+ }
467
+ }, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
468
+ items: items,
469
+ selectedItemIds: [],
470
+ "aria-labelledby": "autocompleteLabel"
471
+ }))));
472
+ };
473
+ export const InOverlayWithCustomScrollContainerRef = () => {
474
+ const scrollContainerRef = useRef(null);
475
+ const inputRef = useRef(null);
476
+ const [isOpen, setIsOpen] = useState(false);
477
+
478
+ const handleOpen = () => {
479
+ setIsOpen(true);
480
+ inputRef.current && inputRef.current.focus();
481
+ };
482
+
483
+ return /*#__PURE__*/React.createElement(AnchoredOverlay, {
484
+ open: isOpen,
485
+ onOpen: handleOpen,
486
+ onClose: () => setIsOpen(false),
487
+ width: "large",
488
+ height: "xsmall",
489
+ focusTrapSettings: {
490
+ initialFocusRef: inputRef
491
+ },
492
+ side: "inside-top",
493
+ renderAnchor: props => /*#__PURE__*/React.createElement(ButtonInvisible, props, "open overlay")
494
+ }, /*#__PURE__*/React.createElement(Box, {
495
+ as: "label",
496
+ display: "block",
497
+ htmlFor: "autocompleteInput",
498
+ id: "autocompleteLabel",
499
+ sx: {
500
+ // visually hides this label for sighted users
501
+ position: 'absolute',
502
+ width: '1px',
503
+ height: '1px',
504
+ padding: '0',
505
+ margin: '-1px',
506
+ overflow: 'hidden',
507
+ clip: 'rect(0, 0, 0, 0)',
508
+ whiteSpace: 'nowrap',
509
+ borderWidth: '0'
510
+ }
511
+ }, "Pick options"), /*#__PURE__*/React.createElement(Autocomplete, null, /*#__PURE__*/React.createElement(Box, {
512
+ display: "flex",
513
+ flexDirection: "column",
514
+ height: "100%"
515
+ }, /*#__PURE__*/React.createElement(Box, {
516
+ paddingX: "3",
517
+ paddingY: "1",
518
+ borderWidth: 0,
519
+ borderBottomWidth: 1,
520
+ borderColor: "border.default",
521
+ borderStyle: "solid"
522
+ }, /*#__PURE__*/React.createElement(Autocomplete.Input, {
523
+ block: true,
524
+ as: TextInput,
525
+ ref: inputRef,
526
+ id: "autocompleteInput",
527
+ sx: {
528
+ display: 'flex',
529
+ border: '0',
530
+ padding: '0',
531
+ boxShadow: 'none',
532
+ ':focus-within': {
533
+ border: '0',
534
+ boxShadow: 'none'
535
+ }
536
+ }
537
+ })), /*#__PURE__*/React.createElement(Box, {
538
+ overflow: "auto",
539
+ flexGrow: 1,
540
+ ref: scrollContainerRef
541
+ }, /*#__PURE__*/React.createElement(Autocomplete.Menu, {
542
+ items: items,
543
+ selectedItemIds: [] // onSelectedChange={onSelectedChange}
544
+ ,
545
+ customScrollContainerRef: scrollContainerRef,
546
+ "aria-labelledby": "autocompleteLabel"
547
+ })))));
548
+ };
549
+ InOverlayWithCustomScrollContainerRef.displayName = "InOverlayWithCustomScrollContainerRef";
@@ -137,7 +137,7 @@ function CustomHeader({
137
137
 
138
138
  if (typeof title === 'string' && typeof subtitle === 'string') {
139
139
  return /*#__PURE__*/React.createElement(Box, {
140
- bg: "auto.blue.3"
140
+ bg: "accent.subtle"
141
141
  }, /*#__PURE__*/React.createElement("h1", {
142
142
  id: dialogLabelId
143
143
  }, title.toUpperCase()), /*#__PURE__*/React.createElement("h2", {
@@ -154,7 +154,7 @@ function CustomBody({
154
154
  children
155
155
  }) {
156
156
  return /*#__PURE__*/React.createElement(Dialog.Body, {
157
- bg: "auto.red.3"
157
+ bg: "danger.subtle"
158
158
  }, children);
159
159
  }
160
160
 
@@ -164,7 +164,7 @@ function CustomFooter({
164
164
  footerButtons
165
165
  }) {
166
166
  return /*#__PURE__*/React.createElement(Dialog.Footer, {
167
- bg: "auto.yellow.3"
167
+ bg: "attention.subtle"
168
168
  }, footerButtons ? /*#__PURE__*/React.createElement(Dialog.Buttons, {
169
169
  buttons: footerButtons
170
170
  }) : null);
@@ -39,7 +39,7 @@ const SingleExampleContainer = ({
39
39
  }
40
40
  }, label ? /*#__PURE__*/React.createElement(Text, {
41
41
  fontSize: 0,
42
- color: "text.tertiary"
42
+ color: "fg.muted"
43
43
  }, label) : null, children);
44
44
 
45
45
  SingleExampleContainer.displayName = "SingleExampleContainer";
@@ -36,7 +36,7 @@ const SingleExampleContainer = ({
36
36
  }
37
37
  }, label ? /*#__PURE__*/React.createElement(Text, {
38
38
  fontSize: 0,
39
- color: "text.tertiary"
39
+ color: "fg.muted"
40
40
  }, label) : null, children);
41
41
 
42
42
  SingleExampleContainer.displayName = "SingleExampleContainer";