Skip to content

feat: support selectionMode="replace" in grid collection test utils #8028

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 25 commits into
base: main
Choose a base branch
from

Conversation

LFDanLu
Copy link
Member

@LFDanLu LFDanLu commented Apr 2, 2025

Closes #7884

✅ Pull Request Checklist:

  • Included link to corresponding React Spectrum GitHub Issue.
  • Added/updated unit tests and storybook for this change (for new code or code which already has tests).
  • Filled out test instructions.
  • Updated documentation (if it already exists for this component).
  • Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:

🧢 Your Project:

@LFDanLu LFDanLu changed the base branch from main to test_util_bug_fixes April 2, 2025 22:31
@rspbot
Copy link

rspbot commented Apr 3, 2025

@LFDanLu LFDanLu changed the title feat: (WIP) enhance selectionMode="replace" support in grid collection test utils feat: support selectionMode="replace" in grid collection test utils Apr 3, 2025
Comment on lines 107 to 108
// TODO: perhaps this should just be shouldUseModifierKeys?
selectionBehavior = 'toggle'
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API naming feels unclear TBH, people may be confused as to when they would apply it. When set to selectionBehavior="replace" this causes the alt/meta key to be used when keyboard navigating/pressing to select a row so that it doesn't cause your previous selection to be replaced on focus/click. I wasn't certain if something like shouldUseModifierKeys was clear either since a user may not know what the "modifier keys" even do

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think selectionBehavior is fine or gridListSelectionBehavior if you want to be clear it should match, then the user profiles/interactions should handle most things behind the scenes

@LFDanLu LFDanLu marked this pull request as ready for review April 8, 2025 17:05
Base automatically changed from test_util_bug_fixes to main April 8, 2025 21:31
@rspbot
Copy link

rspbot commented Apr 14, 2025

Comment on lines 107 to 108
// TODO: perhaps this should just be shouldUseModifierKeys?
selectionBehavior = 'toggle'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think selectionBehavior is fine or gridListSelectionBehavior if you want to be clear it should match, then the user profiles/interactions should handle most things behind the scenes

@rspbot
Copy link

rspbot commented May 19, 2025

@@ -140,7 +159,14 @@ export class TreeTester {
// Note that long press interactions with rows is strictly touch only for grid rows
await triggerLongPress({element: cell, advanceTimer: this._advanceTimer, pointerOpts: {pointerType: 'touch'}});
} else {
await pressElement(this.user, cell, interactionType);
// TODO add modifiers here? Maybe move into pressElement if we get more cases for different types of modifier keys
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't quite follow this todo

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was more of a musing around perhaps consolidating all of these "trigger a press while holding a modifier key" into pressElement itself if it turns out that we have a lot of these kinds of interactions in our components

};

/**
* Toggles the selection for the specified tree row. Defaults to using the interaction type set on the tree tester.
* Note that this will endevor to always add/remove JUST the provided row to the set of selected rows.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe an option shouldExpandCurrentSelection?: boolean

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for now I want to avoid that because having shouldExpandCurrentSelection=false in a multiselect tree that has selectionBehavior='toggle' would mean the user would expect all rows to be unselected (via click/keyboard/etc) and then their target row toggled on which adds to the complexity here, especially for a virtualized case.

@@ -137,7 +137,7 @@ export class TabsTester {
}

if (interactionType === 'keyboard') {
if (document.activeElement !== this._tablist || !this._tablist.contains(document.activeElement)) {
if (document.activeElement !== this._tablist && !this._tablist.contains(document.activeElement)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of calling focus if it's not on the tablist, perhaps we should be throwing an error sayings, "navigate to the tablist"?
I know you didn't change that behaviour here, so more of a future topic
I'm just worried about the case that came up recently where calling focus directly was problematic because it didn't follow user interactions closely enough, skipped some steps, which caused the wrong state in the UI

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah its a bit tricky, trying to balance usability (forcing the user to simulate all the interactions required to go from where ever they are in their test to the target TabList) vs realism. I think I'd lean towards the latter to avoid the issues you mentioned but will see about do that in a follow up.

@@ -137,7 +136,7 @@ export class TreeTester {
// this would be better than the check to do nothing in events.ts
// also, it'd be good to be able to trigger selection on the row instead of having to go to the checkbox directly
if (interactionType === 'keyboard' && (!checkboxSelection || !rowCheckbox)) {
await this.keyboardNavigateToRow({row, useAltKey: selectionBehavior === 'replace'});
await this.keyboardNavigateToRow({row, avoidSelectionOnNav: selectionBehavior === 'replace'});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"avoid" feels a bit, "i'll try my best, but it might happen" to me, maybe one of these instead?
noSelectionOnNav
shouldNotSelectOnNav

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

haha, I was thinking about exactly this when naming the option. I actually did want to give that kind of impression since using noSelectionOnNav or shouldNotSelectOnNav would mean it would sound like selection SHOULD change on nav if those were false, something which wouldn't happen for a collection with selectionBehavior: 'toggle' without me firing Enter after every ArrowUp/Down.

avoidSelectionOnNav is more of the following: if true we endeavor to avoid selection on keyboard navigation via the Alt modifier, otherwise if false we won't do anything special when keyboard navigating and if something gets selected as you keyboard navigate that is expected due to the selectionBehavior of your collection

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hrmmmmm..... sounds tricky to document. maybe instead of a boolean, it should be
selectionOnNav: 'default' | 'none' and it defaults to 'default'

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that sounds good, will update

@rspbot
Copy link

rspbot commented May 19, 2025

@rspbot
Copy link

rspbot commented May 23, 2025

@rspbot
Copy link

rspbot commented May 23, 2025

## API Changes

react-aria-components

/react-aria-components:DropZone

 DropZone {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   children?: ReactNode | ((DropZoneRenderProps & {
     defaultChildren: ReactNode | undefined
 })) => ReactNode
   className?: string | ((DropZoneRenderProps & {
     defaultClassName: string | undefined
 })) => string
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   isDisabled?: boolean
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   onHoverChange?: (boolean) => void
   onHoverStart?: (HoverEvent) => void
   slot?: string | null
   style?: CSSProperties | ((DropZoneRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
 }

/react-aria-components:ListBox

 ListBox <T extends {}> {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | ({}) => ReactNode
   className?: string | ((ListBoxRenderProps & {
     defaultClassName: string | undefined
 })) => string
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   dragAndDropHooks?: DragAndDropHooks
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   id?: string
   items?: Iterable<T>
   layout?: 'stack' | 'grid' = 'stack'
   onAction?: (Key) => void
   onBlur?: (FocusEvent<Target>) => void
   onFocus?: (FocusEvent<Target>) => void
   onFocusChange?: (boolean) => void
   onScroll?: (UIEvent<Element>) => void
   onSelectionChange?: (Selection) => void
   orientation?: Orientation = 'vertical'
   renderEmptyState?: (ListBoxRenderProps) => ReactNode
   selectedKeys?: 'all' | Iterable<Key>
   selectionBehavior?: SelectionBehavior
   selectionMode?: SelectionMode
-  shouldFocusOnHover?: boolean
   shouldFocusWrap?: boolean
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   style?: CSSProperties | ((ListBoxRenderProps & {
 })) => CSSProperties | undefined
 }

/react-aria-components:Tree

 Tree <T extends {}> {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | ({}) => ReactNode
   className?: string | ((TreeRenderProps & {
     defaultClassName: string | undefined
 })) => string
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
-  dragAndDropHooks?: DragAndDropHooks
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   items?: Iterable<T>
-  keyboardDelegate?: KeyboardDelegate
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onScroll?: (UIEvent<Element>) => void
   onSelectionChange?: (Selection) => void
   selectedKeys?: 'all' | Iterable<Key>
   selectionBehavior?: SelectionBehavior
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   style?: CSSProperties | ((TreeRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
 }

/react-aria-components:DropIndicator

 DropIndicator {
-  activateButtonRef?: RefObject<FocusableElement | null>
   children?: ReactNode | ((DropIndicatorRenderProps & {
     defaultChildren: ReactNode | undefined
 })) => ReactNode
   className?: string | ((DropIndicatorRenderProps & {
 })) => string
   style?: CSSProperties | ((DropIndicatorRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
   target: DropTarget
 }

/react-aria-components:DropZoneProps

 DropZoneProps {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   children?: ReactNode | ((DropZoneRenderProps & {
     defaultChildren: ReactNode | undefined
 })) => ReactNode
   className?: string | ((DropZoneRenderProps & {
     defaultClassName: string | undefined
 })) => string
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   isDisabled?: boolean
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   onHoverChange?: (boolean) => void
   onHoverStart?: (HoverEvent) => void
   slot?: string | null
   style?: CSSProperties | ((DropZoneRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
 }

/react-aria-components:ListBoxProps

 ListBoxProps <T> {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   className?: string | ((ListBoxRenderProps & {
     defaultClassName: string | undefined
 })) => string
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   dragAndDropHooks?: DragAndDropHooks
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   id?: string
   items?: Iterable<T>
   layout?: 'stack' | 'grid' = 'stack'
   onAction?: (Key) => void
   onBlur?: (FocusEvent<Target>) => void
   onFocus?: (FocusEvent<Target>) => void
   onFocusChange?: (boolean) => void
   onScroll?: (UIEvent<Element>) => void
   onSelectionChange?: (Selection) => void
   orientation?: Orientation = 'vertical'
   renderEmptyState?: (ListBoxRenderProps) => ReactNode
   selectedKeys?: 'all' | Iterable<Key>
   selectionBehavior?: SelectionBehavior
   selectionMode?: SelectionMode
-  shouldFocusOnHover?: boolean
   shouldFocusWrap?: boolean
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   style?: CSSProperties | ((ListBoxRenderProps & {
 })) => CSSProperties | undefined
 }

/react-aria-components:TreeProps

 TreeProps <T> {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   className?: string | ((TreeRenderProps & {
     defaultClassName: string | undefined
 })) => string
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
-  dragAndDropHooks?: DragAndDropHooks
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   items?: Iterable<T>
-  keyboardDelegate?: KeyboardDelegate
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onScroll?: (UIEvent<Element>) => void
   onSelectionChange?: (Selection) => void
   selectedKeys?: 'all' | Iterable<Key>
   selectionBehavior?: SelectionBehavior
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   style?: CSSProperties | ((TreeRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
 }

/react-aria-components:TreeItemRenderProps

 TreeItemRenderProps {
-  allowsDragging?: boolean
   hasChildItems: boolean
   id: Key
   isDisabled: boolean
-  isDragging?: boolean
-  isDropTarget?: boolean
   isExpanded: boolean
   isFocusVisible: boolean
   isFocusVisibleWithin: boolean
   isFocused: boolean
   isPressed: boolean
   isSelected: boolean
   level: number
   selectionBehavior: SelectionBehavior
   selectionMode: SelectionMode
   state: TreeState<unknown>
 }

/react-aria-components:TreeItemContentRenderProps

 TreeItemContentRenderProps {
-  allowsDragging?: boolean
   hasChildItems: boolean
   id: Key
   isDisabled: boolean
-  isDragging?: boolean
-  isDropTarget?: boolean
   isExpanded: boolean
   isFocusVisible: boolean
   isFocusVisibleWithin: boolean
   isFocused: boolean
   isPressed: boolean
   isSelected: boolean
   level: number
   selectionBehavior: SelectionBehavior
   selectionMode: SelectionMode
   state: TreeState<unknown>
 }

/react-aria-components:DragAndDropOptions

 DragAndDropOptions {
   acceptedDragTypes?: 'all' | Array<string | symbol> = 'all'
   dropTargetDelegate?: DropTargetDelegate
   getAllowedDropOperations?: () => Array<DropOperation>
   getDropOperation?: (DropTarget, DragTypes, Array<DropOperation>) => DropOperation
   getItems?: (Set<Key>) => Array<DragItem> = () => []
   isDisabled?: boolean
   onDragEnd?: (DraggableCollectionEndEvent) => void
   onDragMove?: (DraggableCollectionMoveEvent) => void
   onDragStart?: (DraggableCollectionStartEvent) => void
   onDrop?: (DroppableCollectionDropEvent) => void
-  onDropActivate?: (DroppableCollectionActivateEvent) => void
   onDropEnter?: (DroppableCollectionEnterEvent) => void
   onDropExit?: (DroppableCollectionExitEvent) => void
   onInsert?: (DroppableCollectionInsertDropEvent) => void
   onItemDrop?: (DroppableCollectionOnItemDropEvent) => void
-  onMove?: (DroppableCollectionReorderEvent) => void
   onReorder?: (DroppableCollectionReorderEvent) => void
   onRootDrop?: (DroppableCollectionRootDropEvent) => void
   renderDragPreview?: (Array<DragItem>) => JSX.Element
   renderDropIndicator?: (DropTarget) => JSX.Element
 }

/react-aria-components:DropIndicatorProps

 DropIndicatorProps {
-  activateButtonRef?: RefObject<FocusableElement | null>
   children?: ReactNode | ((DropIndicatorRenderProps & {
     defaultChildren: ReactNode | undefined
 })) => ReactNode
   className?: string | ((DropIndicatorRenderProps & {
 })) => string
   style?: CSSProperties | ((DropIndicatorRenderProps & {
     defaultStyle: CSSProperties
 })) => CSSProperties | undefined
   target: DropTarget
 }

/react-aria-components:CalendarState

-CalendarState {
-  focusNextDay: () => void
-  focusNextPage: () => void
-  focusNextRow: () => void
-  focusNextSection: (boolean) => void
-  focusPreviousDay: () => void
-  focusPreviousPage: () => void
-  focusPreviousRow: () => void
-  focusPreviousSection: (boolean) => void
-  focusSectionEnd: () => void
-  focusSectionStart: () => void
-  focusedDate: CalendarDate
-  getDatesInWeek: (number, CalendarDate) => Array<CalendarDate | null>
-  isCellDisabled: (CalendarDate) => boolean
-  isCellFocused: (CalendarDate) => boolean
-  isCellUnavailable: (CalendarDate) => boolean
-  isDisabled: boolean
-  isFocused: boolean
-  isInvalid: (CalendarDate) => boolean
-  isNextVisibleRangeInvalid: () => boolean
-  isPreviousVisibleRangeInvalid: () => boolean
-  isReadOnly: boolean
-  isSelected: (CalendarDate) => boolean
-  isValueInvalid: boolean
-  maxValue?: DateValue | null
-  minValue?: DateValue | null
-  selectDate: (CalendarDate) => void
-  selectFocusedDate: () => void
-  setFocused: (boolean) => void
-  setFocusedDate: (CalendarDate) => void
-  setValue: (CalendarDate | null) => void
-  timeZone: string
-  value: CalendarDate | null
-  visibleRange: RangeValue<CalendarDate>
-}

/react-aria-components:CheckboxGroupState

-CheckboxGroupState {
-  addValue: (string) => void
-  commitValidation: () => void
-  displayValidation: ValidationResult
-  isDisabled: boolean
-  isInvalid: boolean
-  isReadOnly: boolean
-  isRequired: boolean
-  isSelected: (string) => boolean
-  realtimeValidation: ValidationResult
-  removeValue: (string) => void
-  resetValidation: () => void
-  setInvalid: (string, ValidationResult) => void
-  setValue: (Array<string>) => void
-  toggleValue: (string) => void
-  updateValidation: (ValidationResult) => void
-  value: readonly Array<string>
-}

/react-aria-components:ColorAreaState

-ColorAreaState {
-  channels: {
-    xChannel: ColorChannel
-  yChannel: ColorChannel
-  zChannel: ColorChannel
-}
-  decrementX: (number) => void
-  decrementY: (number) => void
-  getDisplayColor: () => Color
-  getThumbPosition: () => {
-    x: number
-  y: number
-}
-  incrementX: (number) => void
-  incrementY: (number) => void
-  isDragging: boolean
-  setColorFromPoint: (number, number) => void
-  setDragging: (boolean) => void
-  setValue: (string | Color) => void
-  setXValue: (number) => void
-  setYValue: (number) => void
-  value: Color
-  xChannelPageStep: number
-  xChannelStep: number
-  xValue: number
-  yChannelPageStep: number
-  yChannelStep: number
-  yValue: number
-}

/react-aria-components:ColorFieldState

-ColorFieldState {
-  colorValue: Color | null
-  commit: () => void
-  commitValidation: () => void
-  decrement: () => void
-  decrementToMin: () => void
-  displayValidation: ValidationResult
-  increment: () => void
-  incrementToMax: () => void
-  inputValue: string
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  setInputValue: (string) => void
-  updateValidation: (ValidationResult) => void
-  validate: (string) => boolean
-}

/react-aria-components:ColorPickerState

-ColorPickerState {
-  color: Color
-  setColor: (Color | null) => void
-}

/react-aria-components:ColorSliderState

-ColorSliderState {
-  decrementThumb: (number, number) => void
-  focusedThumb: number | undefined
-  getDisplayColor: () => Color
-  getFormattedValue: (number) => string
-  getPercentValue: (number) => number
-  getThumbMaxValue: (number) => number
-  getThumbMinValue: (number) => number
-  getThumbPercent: (number) => number
-  getThumbValue: (number) => number
-  getThumbValueLabel: (number) => string
-  getValuePercent: (number) => number
-  incrementThumb: (number, number) => void
-  isDisabled: boolean
-  isDragging: boolean
-  isThumbDragging: (number) => boolean
-  isThumbEditable: (number) => boolean
-  orientation: Orientation
-  pageSize: number
-  setFocusedThumb: (number | undefined) => void
-  setThumbDragging: (number, boolean) => void
-  setThumbEditable: (number, boolean) => void
-  setThumbPercent: (number, number) => void
-  setThumbValue: (number, number) => void
-  setValue: (string | Color) => void
-  step: number
-  value: Color
-  values: Array<number>
-}

/react-aria-components:ColorWheelState

-ColorWheelState {
-  decrement: (number) => void
-  getDisplayColor: () => Color
-  getThumbPosition: (number) => {
-    x: number
-  y: number
-}
-  hue: number
-  increment: (number) => void
-  isDisabled: boolean
-  isDragging: boolean
-  pageStep: number
-  setDragging: (boolean) => void
-  setHue: (number) => void
-  setHueFromPoint: (number, number, number) => void
-  setValue: (string | Color) => void
-  step: number
-  value: Color
-}

/react-aria-components:ComboBoxState

-ComboBoxState <T> {
-  close: () => void
-  collection: Collection<Node<T>>
-  commit: () => void
-  commitValidation: () => void
-  disabledKeys: Set<Key>
-  displayValidation: ValidationResult
-  focusStrategy: FocusStrategy | null
-  inputValue: string
-  isFocused: boolean
-  isOpen: boolean
-  open: (FocusStrategy | null, MenuTriggerAction) => void
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  revert: () => void
-  selectedItem: Node<T> | null
-  selectedKey: Key | null
-  selectionManager: SelectionManager
-  setFocused: (boolean) => void
-  setInputValue: (string) => void
-  setOpen: (boolean) => void
-  setSelectedKey: (Key | null) => void
-  toggle: (FocusStrategy | null, MenuTriggerAction) => void
-  updateValidation: (ValidationResult) => void
-}

/react-aria-components:DateFieldState

-DateFieldState {
-  calendar: Calendar
-  clearSegment: (SegmentType) => void
-  commitValidation: () => void
-  confirmPlaceholder: () => void
-  dateFormatter: DateFormatter
-  dateValue: Date
-  decrement: (SegmentType) => void
-  decrementPage: (SegmentType) => void
-  displayValidation: ValidationResult
-  formatValue: (FieldOptions) => string
-  getDateFormatter: (string, FormatterOptions) => DateFormatter
-  granularity: Granularity
-  increment: (SegmentType) => void
-  incrementPage: (SegmentType) => void
-  isDisabled: boolean
-  isInvalid: boolean
-  isReadOnly: boolean
-  isRequired: boolean
-  maxGranularity: 'year' | 'month' | Granularity
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  segments: Array<DateSegment>
-  setSegment: (SegmentType, number) => void
-  setValue: (DateValue | null) => void
-  updateValidation: (ValidationResult) => void
-  value: DateValue | null
-}

/react-aria-components:DatePickerState

-DatePickerState {
-  close: () => void
-  commitValidation: () => void
-  dateValue: DateValue | null
-  displayValidation: ValidationResult
-  formatValue: (string, FieldOptions) => string
-  getDateFormatter: (string, FormatterOptions) => DateFormatter
-  granularity: Granularity
-  hasTime: boolean
-  isInvalid: boolean
-  isOpen: boolean
-  open: () => void
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  setDateValue: (DateValue) => void
-  setOpen: (boolean) => void
-  setTimeValue: (TimeValue) => void
-  setValue: (DateValue | null) => void
-  timeValue: TimeValue | null
-  toggle: () => void
-  updateValidation: (ValidationResult) => void
-  value: DateValue | null
-}

/react-aria-components:DateRangePickerState

-DateRangePickerState {
-  close: () => void
-  commitValidation: () => void
-  dateRange: RangeValue<DateValue | null> | null
-  displayValidation: ValidationResult
-  formatValue: (string, FieldOptions) => {
-    start: string
-  end: string
-} | null
-  getDateFormatter: (string, FormatterOptions) => DateFormatter
-  granularity: Granularity
-  hasTime: boolean
-  isInvalid: boolean
-  isOpen: boolean
-  open: () => void
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  setDate: ('start' | 'end', DateValue | null) => void
-  setDateRange: (DateRange) => void
-  setDateTime: ('start' | 'end', DateValue | null) => void
-  setOpen: (boolean) => void
-  setTime: ('start' | 'end', TimeValue | null) => void
-  setTimeRange: (TimeRange) => void
-  setValue: (DateRange | null) => void
-  timeRange: RangeValue<TimeValue | null> | null
-  toggle: () => void
-  updateValidation: (ValidationResult) => void
-  value: RangeValue<DateValue | null>
-}

/react-aria-components:DisclosureState

-DisclosureState {
-  collapse: () => void
-  expand: () => void
-  isExpanded: boolean
-  setExpanded: (boolean) => void
-  toggle: () => void
-}

/react-aria-components:DisclosureGroupState

-DisclosureGroupState {
-  allowsMultipleExpanded: boolean
-  expandedKeys: Set<Key>
-  isDisabled: boolean
-  setExpandedKeys: (Set<Key>) => void
-  toggleKey: (Key) => void
-}

/react-aria-components:DraggableCollectionState

-DraggableCollectionState {
-  collection: Collection<Node<unknown>>
-  draggedKey: Key | null
-  draggingKeys: Set<Key>
-  endDrag: (DraggableCollectionEndEvent) => void
-  getAllowedDropOperations?: () => Array<DropOperation>
-  getItems: (Key) => Array<DragItem>
-  getKeysForDrag: (Key) => Set<Key>
-  isDisabled?: boolean
-  isDragging: (Key) => boolean
-  moveDrag: (DragMoveEvent) => void
-  preview?: RefObject<DragPreviewRenderer | null>
-  selectionManager: MultipleSelectionManager
-  startDrag: (Key, DragStartEvent) => void
-}

/react-aria-components:DroppableCollectionState

-DroppableCollectionState {
-  collection: Collection<Node<unknown>>
-  getDropOperation: (DropOperationEvent) => DropOperation
-  isDisabled?: boolean
-  isDropTarget: (DropTarget | null) => boolean
-  selectionManager: MultipleSelectionManager
-  setTarget: (DropTarget | null) => void
-  target: DropTarget | null
-}

/react-aria-components:ListState

-ListState <T> {
-  collection: Collection<Node<T>>
-  disabledKeys: Set<Key>
-  selectionManager: SelectionManager
-}

/react-aria-components:MultipleSelectionState

-MultipleSelectionState {
-  childFocusStrategy: FocusStrategy | null
-  disabledBehavior: DisabledBehavior
-  disabledKeys: Set<Key>
-  disallowEmptySelection: boolean
-  focusedKey: Key | null
-  isFocused: boolean
-  selectedKeys: Selection
-  selectionBehavior: SelectionBehavior
-  selectionMode: SelectionMode
-  setFocused: (boolean) => void
-  setFocusedKey: (Key | null, FocusStrategy) => void
-  setSelectedKeys: (Selection) => void
-  setSelectionBehavior: (SelectionBehavior) => void
-}

/react-aria-components:NumberFieldState

-NumberFieldState {
-  canDecrement: boolean
-  canIncrement: boolean
-  commit: () => void
-  commitValidation: () => void
-  decrement: () => void
-  decrementToMin: () => void
-  displayValidation: ValidationResult
-  increment: () => void
-  incrementToMax: () => void
-  inputValue: string
-  maxValue?: number
-  minValue?: number
-  numberValue: number
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  setInputValue: (string) => void
-  setNumberValue: (number) => void
-  updateValidation: (ValidationResult) => void
-  validate: (string) => boolean
-}

/react-aria-components:OverlayTriggerState

-OverlayTriggerState {
-  close: () => void
-  isOpen: boolean
-  open: () => void
-  setOpen: (boolean) => void
-  toggle: () => void
-}

/react-aria-components:RadioGroupState

-RadioGroupState {
-  commitValidation: () => void
-  displayValidation: ValidationResult
-  isDisabled: boolean
-  isInvalid: boolean
-  isReadOnly: boolean
-  isRequired: boolean
-  lastFocusedValue: string | null
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  selectedValue: string | null
-  setLastFocusedValue: (string | null) => void
-  setSelectedValue: (string | null) => void
-  updateValidation: (ValidationResult) => void
-}

/react-aria-components:RangeCalendarState

-RangeCalendarState {
-  anchorDate: CalendarDate | null
-  focusNextDay: () => void
-  focusNextPage: () => void
-  focusNextRow: () => void
-  focusNextSection: (boolean) => void
-  focusPreviousDay: () => void
-  focusPreviousPage: () => void
-  focusPreviousRow: () => void
-  focusPreviousSection: (boolean) => void
-  focusSectionEnd: () => void
-  focusSectionStart: () => void
-  focusedDate: CalendarDate
-  getDatesInWeek: (number, CalendarDate) => Array<CalendarDate | null>
-  highlightDate: (CalendarDate) => void
-  highlightedRange: RangeValue<CalendarDate> | null
-  isCellDisabled: (CalendarDate) => boolean
-  isCellFocused: (CalendarDate) => boolean
-  isCellUnavailable: (CalendarDate) => boolean
-  isDisabled: boolean
-  isDragging: boolean
-  isFocused: boolean
-  isInvalid: (CalendarDate) => boolean
-  isNextVisibleRangeInvalid: () => boolean
-  isPreviousVisibleRangeInvalid: () => boolean
-  isReadOnly: boolean
-  isSelected: (CalendarDate) => boolean
-  isValueInvalid: boolean
-  maxValue?: DateValue | null
-  minValue?: DateValue | null
-  selectDate: (CalendarDate) => void
-  selectFocusedDate: () => void
-  setAnchorDate: (CalendarDate | null) => void
-  setDragging: (boolean) => void
-  setFocused: (boolean) => void
-  setFocusedDate: (CalendarDate) => void
-  setValue: (RangeValue<DateValue> | null) => void
-  timeZone: string
-  value: RangeValue<DateValue> | null
-  visibleRange: RangeValue<CalendarDate>
-}

/react-aria-components:RootMenuTriggerState

-RootMenuTriggerState {
-  close: () => void
-  closeSubmenu: (Key, number) => void
-  expandedKeysStack: Array<Key>
-  focusStrategy: FocusStrategy | null
-  isOpen: boolean
-  open: (FocusStrategy | null) => void
-  openSubmenu: (Key, number) => void
-  setOpen: (boolean) => void
-  toggle: (FocusStrategy | null) => void
-}

/react-aria-components:SearchFieldState

-SearchFieldState {
-  setValue: (string) => void
-  value: string
-}

/react-aria-components:SelectState

-SelectState <T> {
-  close: () => void
-  collection: Collection<Node<T>>
-  commitValidation: () => void
-  disabledKeys: Set<Key>
-  displayValidation: ValidationResult
-  focusStrategy: FocusStrategy | null
-  isFocused: boolean
-  isOpen: boolean
-  open: (FocusStrategy | null) => void
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  selectedItem: Node<T> | null
-  selectedKey: Key | null
-  selectionManager: SelectionManager
-  setFocused: (boolean) => void
-  setOpen: (boolean) => void
-  setSelectedKey: (Key | null) => void
-  toggle: (FocusStrategy | null) => void
-  updateValidation: (ValidationResult) => void
-}

/react-aria-components:SliderState

-SliderState {
-  decrementThumb: (number, number) => void
-  focusedThumb: number | undefined
-  getFormattedValue: (number) => string
-  getPercentValue: (number) => number
-  getThumbMaxValue: (number) => number
-  getThumbMinValue: (number) => number
-  getThumbPercent: (number) => number
-  getThumbValue: (number) => number
-  getThumbValueLabel: (number) => string
-  getValuePercent: (number) => number
-  incrementThumb: (number, number) => void
-  isDisabled: boolean
-  isThumbDragging: (number) => boolean
-  isThumbEditable: (number) => boolean
-  orientation: Orientation
-  pageSize: number
-  setFocusedThumb: (number | undefined) => void
-  setThumbDragging: (number, boolean) => void
-  setThumbEditable: (number, boolean) => void
-  setThumbPercent: (number, number) => void
-  setThumbValue: (number, number) => void
-  step: number
-  values: Array<number>
-}

/react-aria-components:TableState

-TableState <T> {
-  collection: TableCollection<T>
-  disabledKeys: Set<Key>
-  isKeyboardNavigationDisabled: boolean
-  selectionManager: SelectionManager
-  setKeyboardNavigationDisabled: (boolean) => void
-  showSelectionCheckboxes: boolean
-  sort: (Key, 'ascending' | 'descending') => void
-  sortDescriptor: SortDescriptor | null
-}

/react-aria-components:TabListState

-TabListState <T> {
-  collection: Collection<Node<T>>
-  disabledKeys: Set<Key>
-  isDisabled: boolean
-  selectedItem: Node<T> | null
-  selectedKey: Key | null
-  selectionManager: SelectionManager
-  setSelectedKey: (Key | null) => void
-}

/react-aria-components:TimeFieldState

-TimeFieldState {
-  calendar: Calendar
-  clearSegment: (SegmentType) => void
-  commitValidation: () => void
-  confirmPlaceholder: () => void
-  dateFormatter: DateFormatter
-  dateValue: Date
-  decrement: (SegmentType) => void
-  decrementPage: (SegmentType) => void
-  displayValidation: ValidationResult
-  formatValue: (FieldOptions) => string
-  getDateFormatter: (string, FormatterOptions) => DateFormatter
-  granularity: Granularity
-  increment: (SegmentType) => void
-  incrementPage: (SegmentType) => void
-  isDisabled: boolean
-  isInvalid: boolean
-  isReadOnly: boolean
-  isRequired: boolean
-  maxGranularity: 'year' | 'month' | Granularity
-  realtimeValidation: ValidationResult
-  resetValidation: () => void
-  segments: Array<DateSegment>
-  setSegment: (SegmentType, number) => void
-  setValue: (DateValue | null) => void
-  timeValue: Time
-  updateValidation: (ValidationResult) => void
-  value: DateValue | null
-}

/react-aria-components:ToastState

-ToastState <T> {
-  add: (T, ToastOptions) => string
-  close: (string) => void
-  pauseAll: () => void
-  resumeAll: () => void
-  visibleToasts: Array<QueuedToast<T>>
-}

/react-aria-components:ToggleGroupState

-ToggleGroupState {
-  isDisabled: boolean
-  selectedKeys: Set<Key>
-  selectionMode: 'single' | 'multiple'
-  setSelected: (Key, boolean) => void
-  setSelectedKeys: (Set<Key>) => void
-  toggleKey: (Key) => void
-}

/react-aria-components:ToggleState

-ToggleState {
-  isSelected: boolean
-  setSelected: (boolean) => void
-  toggle: () => void
-}

/react-aria-components:TooltipTriggerState

-TooltipTriggerState {
-  close: (boolean) => void
-  isOpen: boolean
-  open: (boolean) => void
-}

/react-aria-components:TreeState

-TreeState <T> {
-  collection: Collection<Node<T>>
-  disabledKeys: Set<Key>
-  expandedKeys: Set<Key>
-  selectionManager: SelectionManager
-  setExpandedKeys: (Set<Key>) => void
-  toggleKey: (Key) => void
-}

/react-aria-components:AutocompleteState

-AutocompleteState {
-  focusedNodeId: string | null
-  inputValue: string
-  setFocusedNodeId: (string | null) => void
-  setInputValue: (string) => void
-}

/react-aria-components:VirtualizerState

-VirtualizerState <T extends {}, V> {
-  contentSize: Size
-  endScrolling: () => void
-  isScrolling: boolean
-  setVisibleRect: (Rect) => void
-  startScrolling: () => void
-  virtualizer: Virtualizer<{}, V>
-  visibleViews: Array<ReusableView<{}, V>>
-}

@react-aria/dnd

/@react-aria/dnd:DroppableCollectionOptions

 DroppableCollectionOptions {
   acceptedDragTypes?: 'all' | Array<string | symbol> = 'all'
   dropTargetDelegate: DropTargetDelegate
   getDropOperation?: (DropTarget, DragTypes, Array<DropOperation>) => DropOperation
   keyboardDelegate: KeyboardDelegate
   onDrop?: (DroppableCollectionDropEvent) => void
-  onDropActivate?: (DroppableCollectionActivateEvent) => void
   onDropEnter?: (DroppableCollectionEnterEvent) => void
   onDropExit?: (DroppableCollectionExitEvent) => void
   onInsert?: (DroppableCollectionInsertDropEvent) => void
   onItemDrop?: (DroppableCollectionOnItemDropEvent) => void
-  onKeyDown?: (KeyboardEvent) => void
-  onMove?: (DroppableCollectionReorderEvent) => void
   onReorder?: (DroppableCollectionReorderEvent) => void
   onRootDrop?: (DroppableCollectionRootDropEvent) => void
   shouldAcceptItemDrop?: (ItemDropTarget, DragTypes) => boolean
 }

/@react-aria/dnd:DroppableItemOptions

 DroppableItemOptions {
-  activateButtonRef?: RefObject<FocusableElement | null>
   target: DropTarget
 }

/@react-aria/dnd:DropIndicatorProps

 DropIndicatorProps {
-  activateButtonRef?: RefObject<FocusableElement | null>
   target: DropTarget
 }

/@react-aria/dnd:DropOptions

 DropOptions {
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   getDropOperationForPoint?: (DragTypes, Array<DropOperation>, number, number) => DropOperation
   hasDropButton?: boolean
   isDisabled?: boolean
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   ref: RefObject<FocusableElement | null>

@react-aria/listbox

/@react-aria/listbox:AriaListBoxProps

 AriaListBoxProps <T> {
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children: CollectionChildren<T>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   id?: string
   items?: Iterable<T>
   label?: ReactNode
   onAction?: (Key) => void
   onBlur?: (FocusEvent<Target>) => void
   onFocus?: (FocusEvent<Target>) => void
   onFocusChange?: (boolean) => void
   onSelectionChange?: (Selection) => void
   selectedKeys?: 'all' | Iterable<Key>
   selectionBehavior?: SelectionBehavior
   selectionMode?: SelectionMode
-  shouldFocusOnHover?: boolean
   shouldFocusWrap?: boolean
   shouldSelectOnPressUp?: boolean
 }

@react-spectrum/dnd

/@react-spectrum/dnd:DragAndDropOptions

 DragAndDropOptions {
   acceptedDragTypes?: 'all' | Array<string | symbol> = 'all'
   getAllowedDropOperations?: () => Array<DropOperation>
   getDropOperation?: (DropTarget, DragTypes, Array<DropOperation>) => DropOperation
   getItems?: (Set<Key>) => Array<DragItem> = () => []
   onDragEnd?: (DraggableCollectionEndEvent) => void
   onDragMove?: (DraggableCollectionMoveEvent) => void
   onDragStart?: (DraggableCollectionStartEvent) => void
   onDrop?: (DroppableCollectionDropEvent) => void
-  onDropActivate?: (DroppableCollectionActivateEvent) => void
   onDropEnter?: (DroppableCollectionEnterEvent) => void
   onDropExit?: (DroppableCollectionExitEvent) => void
   onInsert?: (DroppableCollectionInsertDropEvent) => void
   onItemDrop?: (DroppableCollectionOnItemDropEvent) => void
-  onMove?: (DroppableCollectionReorderEvent) => void
   onReorder?: (DroppableCollectionReorderEvent) => void
   onRootDrop?: (DroppableCollectionRootDropEvent) => void
   renderPreview?: (Set<Key>, Key) => JSX.Element
   shouldAcceptItemDrop?: (ItemDropTarget, DragTypes) => boolean

@react-spectrum/dropzone

/@react-spectrum/dropzone:DropZone

 DropZone {
   UNSAFE_className?: string
   UNSAFE_style?: CSSProperties
   alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   bottom?: Responsive<DimensionValue>
   children: ReactNode
   end?: Responsive<DimensionValue>
   flex?: Responsive<string | number | boolean>
   flexBasis?: Responsive<number | string>
   flexGrow?: Responsive<number>
   flexShrink?: Responsive<number>
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   gridArea?: Responsive<string>
   gridColumn?: Responsive<string>
   gridColumnEnd?: Responsive<string>
   gridColumnStart?: Responsive<string>
   gridRow?: Responsive<string>
   gridRowEnd?: Responsive<string>
   gridRowStart?: Responsive<string>
   height?: Responsive<DimensionValue>
   id?: string
   isFilled?: boolean
   isHidden?: Responsive<boolean>
   justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
   left?: Responsive<DimensionValue>
   margin?: Responsive<DimensionValue>
   marginBottom?: Responsive<DimensionValue>
   marginEnd?: Responsive<DimensionValue>
   marginStart?: Responsive<DimensionValue>
   marginTop?: Responsive<DimensionValue>
   marginX?: Responsive<DimensionValue>
   marginY?: Responsive<DimensionValue>
   maxHeight?: Responsive<DimensionValue>
   maxWidth?: Responsive<DimensionValue>
   minHeight?: Responsive<DimensionValue>
   minWidth?: Responsive<DimensionValue>
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   order?: Responsive<number>
   replaceMessage?: string
   right?: Responsive<DimensionValue>
   slot?: string | null
   start?: Responsive<DimensionValue>
   top?: Responsive<DimensionValue>
   width?: Responsive<DimensionValue>
   zIndex?: Responsive<number>
 }

/@react-spectrum/dropzone:SpectrumDropZoneProps

 SpectrumDropZoneProps {
   UNSAFE_className?: string
   UNSAFE_style?: CSSProperties
   alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   bottom?: Responsive<DimensionValue>
   children: ReactNode
   end?: Responsive<DimensionValue>
   flex?: Responsive<string | number | boolean>
   flexBasis?: Responsive<number | string>
   flexGrow?: Responsive<number>
   flexShrink?: Responsive<number>
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   gridArea?: Responsive<string>
   gridColumn?: Responsive<string>
   gridColumnEnd?: Responsive<string>
   gridColumnStart?: Responsive<string>
   gridRow?: Responsive<string>
   gridRowEnd?: Responsive<string>
   gridRowStart?: Responsive<string>
   height?: Responsive<DimensionValue>
   id?: string
   isFilled?: boolean
   isHidden?: Responsive<boolean>
   justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
   left?: Responsive<DimensionValue>
   margin?: Responsive<DimensionValue>
   marginBottom?: Responsive<DimensionValue>
   marginEnd?: Responsive<DimensionValue>
   marginStart?: Responsive<DimensionValue>
   marginTop?: Responsive<DimensionValue>
   marginX?: Responsive<DimensionValue>
   marginY?: Responsive<DimensionValue>
   maxHeight?: Responsive<DimensionValue>
   maxWidth?: Responsive<DimensionValue>
   minHeight?: Responsive<DimensionValue>
   minWidth?: Responsive<DimensionValue>
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   order?: Responsive<number>
   replaceMessage?: string
   right?: Responsive<DimensionValue>
   slot?: string | null
   start?: Responsive<DimensionValue>
   top?: Responsive<DimensionValue>
   width?: Responsive<DimensionValue>
   zIndex?: Responsive<number>
 }

@react-spectrum/s2

/@react-spectrum/s2:DropZone

 DropZone {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   children: ReactNode
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   id?: string
   isFilled?: boolean
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   replaceMessage?: string
   slot?: string | null
   styles?: StylesPropWithHeight
 }

/@react-spectrum/s2:TreeView

 TreeView {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   isDetached?: boolean
   isEmphasized?: boolean
   items?: Iterable<T>
-  keyboardDelegate?: KeyboardDelegate
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onSelectionChange?: (Selection) => void
   renderEmptyState?: (TreeEmptyStateRenderProps) => ReactNode
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   styles?: StylesPropWithHeight
 }

/@react-spectrum/s2:DropZoneProps

 DropZoneProps {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   children: ReactNode
   getDropOperation?: (DragTypes, Array<DropOperation>) => DropOperation
   id?: string
   isFilled?: boolean
   onDrop?: (DropEvent) => void
-  onDropActivate?: (DropActivateEvent) => void
   onDropEnter?: (DropEnterEvent) => void
   onDropExit?: (DropExitEvent) => void
   onDropMove?: (DropMoveEvent) => void
   replaceMessage?: string
   slot?: string | null
   styles?: StylesPropWithHeight
 }

/@react-spectrum/s2:TreeViewProps

 TreeViewProps {
   UNSAFE_className?: UnsafeClassName
   UNSAFE_style?: CSSProperties
   aria-describedby?: string
   aria-details?: string
   aria-label?: string
   aria-labelledby?: string
   autoFocus?: boolean | FocusStrategy
   children?: ReactNode | (T) => ReactNode
   defaultExpandedKeys?: Iterable<Key>
   defaultSelectedKeys?: 'all' | Iterable<Key>
   dependencies?: ReadonlyArray<any>
   disabledBehavior?: DisabledBehavior = 'all'
   disabledKeys?: Iterable<Key>
   disallowEmptySelection?: boolean
   escapeKeyBehavior?: 'clearSelection' | 'none' = 'clearSelection'
   expandedKeys?: Iterable<Key>
   id?: string
   isDetached?: boolean
   isEmphasized?: boolean
   items?: Iterable<T>
-  keyboardDelegate?: KeyboardDelegate
   onAction?: (Key) => void
   onExpandedChange?: (Set<Key>) => any
   onSelectionChange?: (Selection) => void
   renderEmptyState?: (TreeEmptyStateRenderProps) => ReactNode
   selectionMode?: SelectionMode
   shouldSelectOnPressUp?: boolean
   slot?: string | null
   styles?: StylesPropWithHeight
 }

@react-stately/dnd

/@react-stately/dnd:DroppableCollectionStateOptions

 DroppableCollectionStateOptions {
   acceptedDragTypes?: 'all' | Array<string | symbol> = 'all'
   collection: Collection<Node<unknown>>
   getDropOperation?: (DropTarget, DragTypes, Array<DropOperation>) => DropOperation
   isDisabled?: boolean
   onDrop?: (DroppableCollectionDropEvent) => void
   onDropEnter?: (DroppableCollectionEnterEvent) => void
   onDropExit?: (DroppableCollectionExitEvent) => void
   onInsert?: (DroppableCollectionInsertDropEvent) => void
   onItemDrop?: (DroppableCollectionOnItemDropEvent) => void
-  onMove?: (DroppableCollectionReorderEvent) => void
   onReorder?: (DroppableCollectionReorderEvent) => void
   onRootDrop?: (DroppableCollectionRootDropEvent) => void
   selectionManager: MultipleSelectionManager
   shouldAcceptItemDrop?: (ItemDropTarget, DragTypes) => boolean

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Update Tree/Table/etc test utils to handle selectionBehavior="replace"
3 participants