@react-spectrum/autocomplete 3.0.0-nightly.3390 → 3.0.0-nightly.3398

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.
@@ -19,8 +19,8 @@ import {ComboBoxState, useComboBoxState} from '@react-stately/combobox';
19
19
  import {DismissButton} from '@react-aria/overlays';
20
20
  import {Field} from '@react-spectrum/label';
21
21
  import {FocusableRef, ValidationState} from '@react-types/shared';
22
- import {FocusRing, FocusScope} from '@react-aria/focus';
23
22
  import {focusSafely} from '@react-aria/focus';
23
+ import {FocusScope, useFocusRing} from '@react-aria/focus';
24
24
  // @ts-ignore
25
25
  import intlMessages from '../intl/*.json';
26
26
  import {ListBoxBase, useListBoxLayout} from '@react-spectrum/listbox';
@@ -99,7 +99,7 @@ export const MobileSearchAutocomplete = React.forwardRef(function MobileSearchAu
99
99
  ref={domRef}
100
100
  includeNecessityIndicatorInAccessibilityName>
101
101
  <SearchAutocompleteButton
102
- {...mergeProps(triggerProps, fieldProps, {autoFocus: props.autoFocus})}
102
+ {...mergeProps(triggerProps, fieldProps, {autoFocus: props.autoFocus, icon: props.icon})}
103
103
  ref={buttonRef}
104
104
  isQuiet={isQuiet}
105
105
  isDisabled={isDisabled}
@@ -124,6 +124,7 @@ export const MobileSearchAutocomplete = React.forwardRef(function MobileSearchAu
124
124
  });
125
125
 
126
126
  interface SearchAutocompleteButtonProps extends AriaButtonProps {
127
+ icon?: ReactElement,
127
128
  isQuiet?: boolean,
128
129
  isDisabled?: boolean,
129
130
  isReadOnly?: boolean,
@@ -137,7 +138,12 @@ interface SearchAutocompleteButtonProps extends AriaButtonProps {
137
138
  }
138
139
 
139
140
  const SearchAutocompleteButton = React.forwardRef(function SearchAutocompleteButton(props: SearchAutocompleteButtonProps, ref: RefObject<HTMLElement>) {
141
+ let searchIcon = (
142
+ <Magnifier data-testid="searchicon" />
143
+ );
144
+
140
145
  let {
146
+ icon = searchIcon,
141
147
  isQuiet,
142
148
  isDisabled,
143
149
  isReadOnly,
@@ -156,17 +162,15 @@ const SearchAutocompleteButton = React.forwardRef(function SearchAutocompleteBut
156
162
  ? <AlertMedium id={invalidId} aria-label={stringFormatter.format('invalid')} />
157
163
  : <CheckmarkMedium />;
158
164
 
159
- let searchIcon = (
160
- <Magnifier data-testid="searchicon" />
161
- );
162
-
163
- let icon = React.cloneElement(searchIcon, {
164
- UNSAFE_className: classNames(
165
- textfieldStyles,
166
- 'spectrum-Textfield-icon'
167
- ),
168
- size: 'S'
169
- });
165
+ if (icon) {
166
+ icon = React.cloneElement(icon, {
167
+ UNSAFE_className: classNames(
168
+ textfieldStyles,
169
+ 'spectrum-Textfield-icon'
170
+ ),
171
+ size: 'S'
172
+ });
173
+ }
170
174
 
171
175
  let clearButton = (
172
176
  <ClearButton
@@ -199,6 +203,7 @@ const SearchAutocompleteButton = React.forwardRef(function SearchAutocompleteBut
199
203
  });
200
204
 
201
205
  let {hoverProps, isHovered} = useHover({});
206
+ let {isFocused, isFocusVisible, focusProps} = useFocusRing();
202
207
  let {buttonProps} = useButton({
203
208
  ...props,
204
209
  'aria-labelledby': [
@@ -211,88 +216,88 @@ const SearchAutocompleteButton = React.forwardRef(function SearchAutocompleteBut
211
216
  }, ref);
212
217
 
213
218
  return (
214
- <FocusRing
215
- focusClass={classNames(styles, 'is-focused')}
216
- focusRingClass={classNames(styles, 'focus-ring')}>
219
+ <div
220
+ {...mergeProps(hoverProps, focusProps, buttonProps)}
221
+ aria-haspopup="dialog"
222
+ ref={ref as RefObject<HTMLDivElement>}
223
+ style={{...style, outline: 'none'}}
224
+ className={
225
+ classNames(
226
+ styles,
227
+ 'spectrum-InputGroup',
228
+ {
229
+ 'spectrum-InputGroup--quiet': isQuiet,
230
+ 'is-disabled': isDisabled,
231
+ 'spectrum-InputGroup--invalid': validationState === 'invalid',
232
+ 'is-hovered': isHovered,
233
+ 'is-focused': isFocused,
234
+ 'focus-ring': isFocusVisible
235
+ },
236
+ classNames(
237
+ searchAutocompleteStyles,
238
+ 'mobile-searchautocomplete'
239
+ ),
240
+ className
241
+ )
242
+ }>
217
243
  <div
218
- {...mergeProps(hoverProps, buttonProps)}
219
- aria-haspopup="dialog"
220
- ref={ref as RefObject<HTMLDivElement>}
221
- style={{...style, outline: 'none'}}
222
244
  className={
223
245
  classNames(
224
- styles,
225
- 'spectrum-InputGroup',
246
+ textfieldStyles,
247
+ 'spectrum-Textfield',
226
248
  {
227
- 'spectrum-InputGroup--quiet': isQuiet,
228
- 'is-disabled': isDisabled,
229
- 'spectrum-InputGroup--invalid': validationState === 'invalid',
230
- 'is-hovered': isHovered
249
+ 'spectrum-Textfield--invalid': validationState === 'invalid',
250
+ 'spectrum-Textfield--valid': validationState === 'valid',
251
+ 'spectrum-Textfield--quiet': isQuiet
231
252
  },
232
253
  classNames(
233
- searchAutocompleteStyles,
234
- 'mobile-searchautocomplete'
235
- ),
236
- className
254
+ searchStyles,
255
+ 'spectrum-Search',
256
+ {
257
+ 'is-disabled': isDisabled,
258
+ 'is-quiet': isQuiet,
259
+ 'spectrum-Search--invalid': validationState === 'invalid',
260
+ 'spectrum-Search--valid': validationState === 'valid'
261
+ }
262
+ )
237
263
  )
238
264
  }>
239
265
  <div
240
266
  className={
241
267
  classNames(
242
268
  textfieldStyles,
243
- 'spectrum-Textfield',
269
+ 'spectrum-Textfield-input',
244
270
  {
245
- 'spectrum-Textfield--invalid': validationState === 'invalid',
246
- 'spectrum-Textfield--valid': validationState === 'valid',
247
- 'spectrum-Textfield--quiet': isQuiet
271
+ 'spectrum-Textfield-inputIcon': !!icon,
272
+ 'is-hovered': isHovered,
273
+ 'is-placeholder': isPlaceholder,
274
+ 'is-disabled': isDisabled,
275
+ 'is-quiet': isQuiet,
276
+ 'is-focused': isFocused,
277
+ 'focus-ring': isFocusVisible
248
278
  },
249
279
  classNames(
250
280
  searchStyles,
251
- 'spectrum-Search',
252
- {
253
- 'is-disabled': isDisabled,
254
- 'is-quiet': isQuiet,
255
- 'spectrum-Search--invalid': validationState === 'invalid',
256
- 'spectrum-Search--valid': validationState === 'valid'
257
- }
281
+ 'spectrum-Search-input'
258
282
  )
259
283
  )
260
284
  }>
261
- <div
285
+ {icon}
286
+ <span
287
+ id={valueId}
262
288
  className={
263
289
  classNames(
264
- textfieldStyles,
265
- 'spectrum-Textfield-input',
266
- 'spectrum-Textfield-inputIcon',
267
- {
268
- 'is-hovered': isHovered,
269
- 'is-placeholder': isPlaceholder,
270
- 'is-disabled': isDisabled,
271
- 'is-quiet': isQuiet
272
- },
273
- classNames(
274
- searchStyles,
275
- 'spectrum-Search-input'
276
- )
290
+ searchAutocompleteStyles,
291
+ 'mobile-value'
277
292
  )
278
293
  }>
279
- {icon}
280
- <span
281
- id={valueId}
282
- className={
283
- classNames(
284
- searchAutocompleteStyles,
285
- 'mobile-value'
286
- )
287
- }>
288
- {children}
289
- </span>
290
- </div>
291
- {validationState ? validation : null}
292
- {(inputValue !== '' || validationState != null) && !isReadOnly && clearButton}
294
+ {children}
295
+ </span>
293
296
  </div>
297
+ {validationState ? validation : null}
298
+ {(inputValue !== '' || validationState != null) && !isReadOnly && clearButton}
294
299
  </div>
295
- </FocusRing>
300
+ </div>
296
301
  );
297
302
  });
298
303
 
@@ -304,9 +309,14 @@ interface SearchAutocompleteTrayProps extends SpectrumSearchAutocompleteProps<un
304
309
  }
305
310
 
306
311
  function SearchAutocompleteTray(props: SearchAutocompleteTrayProps) {
312
+ let searchIcon = (
313
+ <Magnifier data-testid="searchicon" />
314
+ );
315
+
307
316
  let {
308
317
  // completionMode = 'suggest',
309
318
  state,
319
+ icon = searchIcon,
310
320
  isDisabled,
311
321
  validationState,
312
322
  label,
@@ -450,17 +460,15 @@ function SearchAutocompleteTray(props: SearchAutocompleteTrayProps) {
450
460
  }
451
461
  };
452
462
 
453
- let searchIcon = (
454
- <Magnifier data-testid="searchicon" />
455
- );
456
-
457
- let icon = React.cloneElement(searchIcon, {
458
- UNSAFE_className: classNames(
459
- textfieldStyles,
460
- 'spectrum-Textfield-icon'
461
- ),
462
- size: 'S'
463
- });
463
+ if (icon) {
464
+ icon = React.cloneElement(icon, {
465
+ UNSAFE_className: classNames(
466
+ textfieldStyles,
467
+ 'spectrum-Textfield-icon'
468
+ ),
469
+ size: 'S'
470
+ });
471
+ }
464
472
 
465
473
  return (
466
474
  <FocusScope restoreFocus contain>
@@ -198,7 +198,12 @@ interface SearchAutocompleteInputProps extends SpectrumSearchAutocompleteProps<u
198
198
  }
199
199
 
200
200
  const SearchAutocompleteInput = React.forwardRef(function SearchAutocompleteInput(props: SearchAutocompleteInputProps, ref: RefObject<HTMLElement>) {
201
+ let searchIcon = (
202
+ <Magnifier data-testid="searchicon" />
203
+ );
204
+
201
205
  let {
206
+ icon = searchIcon,
202
207
  isQuiet,
203
208
  isDisabled,
204
209
  isReadOnly,
@@ -233,10 +238,6 @@ const SearchAutocompleteInput = React.forwardRef(function SearchAutocompleteInpu
233
238
  )} />
234
239
  );
235
240
 
236
- let searchIcon = (
237
- <Magnifier data-testid="searchicon" />
238
- );
239
-
240
241
  let clearButton = (
241
242
  <ClearButton
242
243
  {...clearButtonProps}
@@ -324,7 +325,7 @@ const SearchAutocompleteInput = React.forwardRef(function SearchAutocompleteInpu
324
325
  validationState={validationState}
325
326
  isLoading={showLoading && (isOpen || menuTrigger === 'manual' || loadingState === 'loading')}
326
327
  loadingIndicator={loadingState != null && loadingCircle}
327
- icon={searchIcon}
328
+ icon={icon}
328
329
  wrapperChildren={(inputValue !== '' && !isReadOnly) && clearButton} />
329
330
  </div>
330
331
  </FocusRing>