Skip to content

Commit 8b7f090

Browse files
authored
Revert "feat: allow customizing behavior of pressed state (#8971)" (#9578)
This reverts commit 92aa6f4.
1 parent 5959e26 commit 8b7f090

20 files changed

+91
-184
lines changed

packages/@react-spectrum/s2/src/ComboBox.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export interface ComboboxStyleProps {
7979
size?: 'S' | 'M' | 'L' | 'XL'
8080
}
8181
export interface ComboBoxProps<T extends object> extends
82-
Omit<AriaComboBoxProps<T>, 'children' | 'style' | 'className' | 'render' | 'defaultFilter' | 'allowsEmptyCollection' | 'isTriggerUpWhenOpen' | keyof GlobalDOMAttributes>,
82+
Omit<AriaComboBoxProps<T>, 'children' | 'style' | 'className' | 'render' | 'defaultFilter' | 'allowsEmptyCollection' | keyof GlobalDOMAttributes>,
8383
ComboboxStyleProps,
8484
StyleProps,
8585
SpectrumLabelableProps,
@@ -354,7 +354,6 @@ export const ComboBox = /*#__PURE__*/ (forwardRef as forwardRefType)(function Co
354354
return (
355355
<AriaComboBox
356356
{...comboBoxProps}
357-
isTriggerUpWhenOpen
358357
allowsEmptyCollection
359358
style={UNSAFE_style}
360359
className={UNSAFE_className + style(field(), getAllowedOverrides())({
@@ -644,6 +643,9 @@ const ComboboxInner = forwardRef(function ComboboxInner(props: ComboBoxProps<any
644643
)}
645644
<Button
646645
ref={buttonRef}
646+
// Prevent press scale from sticking while ComboBox is open.
647+
// @ts-ignore
648+
isPressed={false}
647649
style={renderProps => pressScale(buttonRef)(renderProps)}
648650
className={renderProps => inputButton({
649651
...renderProps,

packages/@react-spectrum/s2/src/DatePicker.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import {useSpectrumContextProps} from './useSpectrumContextProps';
4141

4242

4343
export interface DatePickerProps<T extends DateValue> extends
44-
Omit<AriaDatePickerProps<T>, 'children' | 'className' | 'style' | 'render' | 'isTriggerUpWhenOpen' | keyof GlobalDOMAttributes>,
44+
Omit<AriaDatePickerProps<T>, 'children' | 'className' | 'style' | 'render' | keyof GlobalDOMAttributes>,
4545
Pick<CalendarProps<T>, 'createCalendar' | 'pageBehavior' | 'firstDayOfWeek' | 'isDateUnavailable'>,
4646
Pick<PopoverProps, 'shouldFlip'>,
4747
StyleProps,
@@ -155,7 +155,6 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function
155155
ref={ref}
156156
isRequired={isRequired}
157157
{...dateFieldProps}
158-
isTriggerUpWhenOpen
159158
style={UNSAFE_style}
160159
className={(UNSAFE_className || '') + style(field(), getAllowedOverrides())({
161160
isInForm: !!formContext,
@@ -278,6 +277,9 @@ export function CalendarButton(props: {isOpen: boolean, size: 'S' | 'M' | 'L' |
278277
return (
279278
<Button
280279
ref={buttonRef}
280+
// Prevent press scale from sticking while DatePicker is open.
281+
// @ts-ignore
282+
isPressed={false}
281283
onFocusChange={setButtonHasFocus}
282284
style={pressScale(buttonRef)}
283285
className={renderProps => inputButton({

packages/@react-spectrum/s2/src/DateRangePicker.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {useSpectrumContextProps} from './useSpectrumContextProps';
3333

3434

3535
export interface DateRangePickerProps<T extends DateValue> extends
36-
Omit<AriaDateRangePickerProps<T>, 'children' | 'className' | 'style' | 'render' | 'isTriggerUpWhenOpen' | keyof GlobalDOMAttributes>,
36+
Omit<AriaDateRangePickerProps<T>, 'children' | 'className' | 'style' | 'render' | keyof GlobalDOMAttributes>,
3737
Pick<RangeCalendarProps<T>, 'createCalendar' | 'pageBehavior' | 'firstDayOfWeek' | 'isDateUnavailable'>,
3838
Pick<PopoverProps, 'shouldFlip'>,
3939
StyleProps,
@@ -89,7 +89,6 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
8989
ref={ref}
9090
isRequired={isRequired}
9191
{...dateFieldProps}
92-
isTriggerUpWhenOpen
9392
style={UNSAFE_style}
9493
className={(UNSAFE_className || '') + style(field(), getAllowedOverrides())({
9594
isInForm: !!formContext,

packages/@react-spectrum/s2/src/DialogTrigger.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
*/
1212

1313
import {DialogTrigger as AriaDialogTrigger, DialogTriggerProps as AriaDialogTriggerProps} from 'react-aria-components';
14+
import {PressResponder} from '@react-aria/interactions';
1415
import {ReactNode} from 'react';
1516

16-
export type DialogTriggerProps = Omit<AriaDialogTriggerProps, 'isTriggerUpWhenOpen'>;
17+
export interface DialogTriggerProps extends AriaDialogTriggerProps {}
1718

1819
/**
1920
* DialogTrigger serves as a wrapper around a Dialog and its associated trigger, linking the Dialog's
@@ -22,6 +23,12 @@ export type DialogTriggerProps = Omit<AriaDialogTriggerProps, 'isTriggerUpWhenOp
2223
*/
2324
export function DialogTrigger(props: DialogTriggerProps): ReactNode {
2425
return (
25-
<AriaDialogTrigger {...props} isTriggerUpWhenOpen />
26+
<AriaDialogTrigger {...props}>
27+
{/* RAC sets isPressed via PressResponder when the dialog is open.
28+
We don't want press scaling to appear to get "stuck", so override this. */}
29+
<PressResponder isPressed={false}>
30+
{props.children}
31+
</PressResponder>
32+
</AriaDialogTrigger>
2633
);
2734
}

packages/@react-spectrum/s2/src/Menu.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import {useSpectrumContextProps} from './useSpectrumContextProps';
5353
// viewbox on LinkOut is super weird just because i copied the icon from designs...
5454
// need to strip id's from icons
5555

56-
export interface MenuTriggerProps extends Omit<AriaMenuTriggerProps, 'isTriggerUpWhenOpen'> {
56+
export interface MenuTriggerProps extends AriaMenuTriggerProps {
5757
/**
5858
* Alignment of the menu relative to the trigger.
5959
*
@@ -543,6 +543,8 @@ export function MenuItem(props: MenuItemProps): ReactNode {
543543
* linking the Menu's open state with the trigger's press state.
544544
*/
545545
function MenuTrigger(props: MenuTriggerProps): ReactNode {
546+
// RAC sets isPressed via PressResponder when the menu is open.
547+
// We don't want press scaling to appear to get "stuck", so override this.
546548
// For mouse interactions, menus open on press start. When the popover underlay appears
547549
// it covers the trigger button, causing onPressEnd to fire immediately and no press scaling
548550
// to occur. We override this by listening for pointerup on the document ourselves.

packages/@react-spectrum/s2/src/Picker.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export interface PickerStyleProps {
9898

9999
type SelectionMode = 'single' | 'multiple';
100100
export interface PickerProps<T extends object, M extends SelectionMode = 'single'> extends
101-
Omit<AriaSelectProps<T, M>, 'children' | 'style' | 'className' | 'render' | 'allowsEmptyCollection' | 'isTriggerUpWhenOpen' | keyof GlobalDOMAttributes>,
101+
Omit<AriaSelectProps<T, M>, 'children' | 'style' | 'className' | 'render' | 'allowsEmptyCollection' | keyof GlobalDOMAttributes>,
102102
PickerStyleProps,
103103
StyleProps,
104104
SpectrumLabelableProps,
@@ -351,7 +351,6 @@ export const Picker = /*#__PURE__*/ (forwardRef as forwardRefType)(function Pick
351351
return (
352352
<AriaSelect
353353
{...pickerProps}
354-
isTriggerUpWhenOpen
355354
aria-describedby={spinnerId}
356355
placeholder={placeholder}
357356
style={UNSAFE_style}
@@ -523,6 +522,9 @@ const PickerButton = createHideableComponent(function PickerButton<T extends obj
523522
<Button
524523
ref={buttonRef}
525524
style={renderProps => pressScale(buttonRef)(renderProps)}
525+
// Prevent press scale from sticking while Picker is open.
526+
// @ts-ignore
527+
isPressed={false}
526528
className={renderProps => inputButton({
527529
...renderProps,
528530
size: size,

packages/@react-spectrum/s2/src/TabsPicker.tsx

Lines changed: 56 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,22 @@ import {edgeToText} from '../style/spectrum-theme' with {type: 'macro'};
4141
import {
4242
FieldLabel
4343
} from './Field';
44-
import {FocusableRef, FocusableRefValue, PressEvent, SpectrumLabelableProps} from '@react-types/shared';
44+
import {FocusableRef, FocusableRefValue, SpectrumLabelableProps} from '@react-types/shared';
4545
import {forwardRefType} from './types';
4646
import {HeaderContext, HeadingContext, Text, TextContext} from './Content';
4747
import {IconContext} from './Icon';
4848
import {Placement, useLocale} from 'react-aria';
4949
import {Popover} from './Popover';
50-
import {PressResponder} from '@react-aria/interactions';
5150
import {pressScale} from './pressScale';
5251
import {raw} from '../style/style-macro' with {type: 'macro'};
53-
import React, {createContext, forwardRef, ReactNode, useContext, useRef, useState} from 'react';
52+
import React, {createContext, forwardRef, ReactNode, useContext, useRef} from 'react';
5453
import {useFocusableRef} from '@react-spectrum/utils';
5554
import {useFormProps} from './Form';
56-
import {useGlobalListeners} from '@react-aria/utils';
5755
import {useSpectrumContextProps} from './useSpectrumContextProps';
5856
export interface PickerStyleProps {
5957
}
6058
export interface PickerProps<T extends object> extends
61-
Omit<AriaSelectProps<T>, 'children' | 'style' | 'className' | 'render' | 'placeholder' | 'isTriggerUpWhenOpen'>,
59+
Omit<AriaSelectProps<T>, 'children' | 'style' | 'className' | 'render' | 'placeholder'>,
6260
PickerStyleProps,
6361
StyleProps,
6462
SpectrumLabelableProps,
@@ -184,85 +182,70 @@ function Picker<T extends object>(props: PickerProps<T>, ref: FocusableRef<HTMLB
184182
let {direction: dir} = useLocale();
185183
let RTLFlipOffset = dir === 'rtl' ? -1 : 1;
186184

187-
// For mouse interactions, pickers open on press start. When the popover underlay appears
188-
// it covers the trigger button, causing onPressEnd to fire immediately and no press scaling
189-
// to occur. We override this by listening for pointerup on the document ourselves.
190-
let [isPressed, setPressed] = useState(false);
191-
let {addGlobalListener} = useGlobalListeners();
192-
let onPressStart = (e: PressEvent) => {
193-
if (e.pointerType !== 'mouse') {
194-
return;
195-
}
196-
setPressed(true);
197-
addGlobalListener(document, 'pointerup', () => {
198-
setPressed(false);
199-
}, {once: true, capture: true});
200-
};
201-
202185
return (
203186
<div>
204187
<AriaSelect
205188
{...pickerProps}
206-
isTriggerUpWhenOpen
207189
className=""
208190
aria-labelledby={`${labelBehavior === 'hide' ? valueId : ''} ${ariaLabelledby}`}>
209191
{({isOpen}) => (
210192
<>
211193
<FieldLabel isQuiet={isQuiet} />
212-
<PressResponder onPressStart={onPressStart} isPressed={isPressed}>
213-
<Button
214-
ref={domRef}
215-
style={renderProps => pressScale(domRef)(renderProps)}
216-
className={renderProps => inputButton({
217-
...renderProps,
218-
size: 'M',
219-
isOpen,
220-
isQuiet,
221-
density
222-
})}>
223-
<SelectValue className={valueStyles + ' ' + raw('&> * {display: none;}')}>
224-
{({defaultChildren}) => {
225-
return (
226-
<Provider
227-
values={[
228-
[IconContext, {
229-
slots: {
230-
icon: {
231-
render: centerBaseline({slot: 'icon', styles: iconCenterWrapper({labelBehavior})}),
232-
styles: icon
233-
}
194+
<Button
195+
ref={domRef}
196+
style={renderProps => pressScale(domRef)(renderProps)}
197+
// Prevent press scale from sticking while Picker is open.
198+
// @ts-ignore
199+
isPressed={false}
200+
className={renderProps => inputButton({
201+
...renderProps,
202+
size: 'M',
203+
isOpen,
204+
isQuiet,
205+
density
206+
})}>
207+
<SelectValue className={valueStyles + ' ' + raw('&> * {display: none;}')}>
208+
{({defaultChildren}) => {
209+
return (
210+
<Provider
211+
values={[
212+
[IconContext, {
213+
slots: {
214+
icon: {
215+
render: centerBaseline({slot: 'icon', styles: iconCenterWrapper({labelBehavior})}),
216+
styles: icon
234217
}
235-
}],
236-
[TextContext, {
237-
slots: {
238-
// Default slot is useful when converting other collections to PickerItems.
239-
[DEFAULT_SLOT]: {
240-
id: valueId,
241-
styles: style({
242-
display: {
243-
default: 'block',
244-
labelBehavior: {
245-
hide: 'none'
246-
}
247-
},
248-
flexGrow: 1,
249-
truncate: true
250-
})({labelBehavior})
251-
}
218+
}
219+
}],
220+
[TextContext, {
221+
slots: {
222+
// Default slot is useful when converting other collections to PickerItems.
223+
[DEFAULT_SLOT]: {
224+
id: valueId,
225+
styles: style({
226+
display: {
227+
default: 'block',
228+
labelBehavior: {
229+
hide: 'none'
230+
}
231+
},
232+
flexGrow: 1,
233+
truncate: true
234+
})({labelBehavior})
252235
}
253-
}],
254-
[InsideSelectValueContext, true]
255-
]}>
256-
{defaultChildren}
257-
</Provider>
258-
);
259-
}}
260-
</SelectValue>
261-
<ChevronIcon
262-
size={size}
263-
className={iconStyles} />
264-
</Button>
265-
</PressResponder>
236+
}
237+
}],
238+
[InsideSelectValueContext, true]
239+
]}>
240+
{defaultChildren}
241+
</Provider>
242+
);
243+
}}
244+
</SelectValue>
245+
<ChevronIcon
246+
size={size}
247+
className={iconStyles} />
248+
</Button>
266249
<Popover
267250
hideArrow
268251
offset={menuOffset}

packages/react-aria-components/src/ComboBox.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ export interface ComboBoxProps<T extends object> extends Omit<AriaComboBoxProps<
7878
*/
7979
formValue?: 'text' | 'key',
8080
/** Whether the combo box allows the menu to be open when the collection is empty. */
81-
allowsEmptyCollection?: boolean,
82-
/** Whether the trigger is up when the overlay is open. */
83-
isTriggerUpWhenOpen?: boolean
81+
allowsEmptyCollection?: boolean
8482
}
8583

8684
export const ComboBoxContext = createContext<ContextValue<ComboBoxProps<any>, HTMLDivElement>>(null);
@@ -210,7 +208,7 @@ function ComboBoxInner<T extends object>({props, collection, comboBoxRef: ref}:
210208
values={[
211209
[ComboBoxStateContext, state],
212210
[LabelContext, {...labelProps, ref: labelRef}],
213-
[ButtonContext, {...buttonProps, ref: buttonRef, isPressed: !props.isTriggerUpWhenOpen && state.isOpen}],
211+
[ButtonContext, {...buttonProps, ref: buttonRef, isPressed: state.isOpen}],
214212
[InputContext, {...inputProps, ref: inputRef}],
215213
[OverlayTriggerStateContext, state],
216214
[PopoverContext, {

packages/react-aria-components/src/DatePicker.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,14 @@ export interface DatePickerProps<T extends DateValue> extends Omit<AriaDatePicke
8888
* The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state.
8989
* @default 'react-aria-DatePicker'
9090
*/
91-
className?: ClassNameOrFunction<DatePickerRenderProps>,
92-
/** Whether the trigger is up when the overlay is open. */
93-
isTriggerUpWhenOpen?: boolean
91+
className?: ClassNameOrFunction<DatePickerRenderProps>
9492
}
9593
export interface DateRangePickerProps<T extends DateValue> extends Omit<AriaDateRangePickerProps<T>, 'label' | 'description' | 'errorMessage' | 'validationState' | 'validationBehavior'>, Pick<DateRangePickerStateOptions<T>, 'shouldCloseOnSelect'>, RACValidation, RenderProps<DateRangePickerRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {
9694
/**
9795
* The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state.
9896
* @default 'react-aria-DateRangePicker'
9997
*/
100-
className?: ClassNameOrFunction<DateRangePickerRenderProps>,
101-
/** Whether the trigger is up when the overlay is open. */
102-
isTriggerUpWhenOpen?: boolean
98+
className?: ClassNameOrFunction<DateRangePickerRenderProps>
10399
}
104100

105101
export const DatePickerContext = createContext<ContextValue<DatePickerProps<any>, HTMLDivElement>>(null);
@@ -179,7 +175,7 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function
179175
[DatePickerStateContext, state],
180176
[GroupContext, {...groupProps, ref: groupRef, isInvalid: state.isInvalid}],
181177
[DateFieldContext, fieldProps],
182-
[ButtonContext, {...buttonProps, isPressed: !props.isTriggerUpWhenOpen && state.isOpen}],
178+
[ButtonContext, {...buttonProps, isPressed: state.isOpen}],
183179
[LabelContext, {...labelProps, ref: labelRef, elementType: 'span'}],
184180
[CalendarContext, calendarProps],
185181
[OverlayTriggerStateContext, state],
@@ -288,7 +284,7 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
288284
values={[
289285
[DateRangePickerStateContext, state],
290286
[GroupContext, {...groupProps, ref: groupRef, isInvalid: state.isInvalid}],
291-
[ButtonContext, {...buttonProps, isPressed: !props.isTriggerUpWhenOpen && state.isOpen}],
287+
[ButtonContext, {...buttonProps, isPressed: state.isOpen}],
292288
[LabelContext, {...labelProps, ref: labelRef, elementType: 'span'}],
293289
[RangeCalendarContext, calendarProps],
294290
[OverlayTriggerStateContext, state],

packages/react-aria-components/src/Dialog.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useCallb
2222
import {RootMenuTriggerStateContext} from './Menu';
2323

2424
export interface DialogTriggerProps extends OverlayTriggerProps {
25-
/** Whether the trigger is up when the overlay is open. */
26-
isTriggerUpWhenOpen?: boolean,
2725
children: ReactNode
2826
}
2927

@@ -88,7 +86,7 @@ export function DialogTrigger(props: DialogTriggerProps): JSX.Element {
8886
style: {'--trigger-width': buttonWidth} as React.CSSProperties
8987
}]
9088
]}>
91-
<PressResponder {...triggerProps} ref={buttonRef} isPressed={!props.isTriggerUpWhenOpen && state.isOpen}>
89+
<PressResponder {...triggerProps} ref={buttonRef} isPressed={state.isOpen}>
9290
{props.children}
9391
</PressResponder>
9492
</Provider>

0 commit comments

Comments
 (0)