react-aria-components 1.10.0 → 1.11.0

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 (302) hide show
  1. package/dist/Breadcrumbs.main.js +9 -2
  2. package/dist/Breadcrumbs.main.js.map +1 -1
  3. package/dist/Breadcrumbs.mjs +10 -3
  4. package/dist/Breadcrumbs.module.js +10 -3
  5. package/dist/Breadcrumbs.module.js.map +1 -1
  6. package/dist/Button.main.js +7 -17
  7. package/dist/Button.main.js.map +1 -1
  8. package/dist/Button.mjs +7 -17
  9. package/dist/Button.module.js +7 -17
  10. package/dist/Button.module.js.map +1 -1
  11. package/dist/Calendar.main.js +36 -14
  12. package/dist/Calendar.main.js.map +1 -1
  13. package/dist/Calendar.mjs +38 -16
  14. package/dist/Calendar.module.js +38 -16
  15. package/dist/Calendar.module.js.map +1 -1
  16. package/dist/Checkbox.main.js +8 -3
  17. package/dist/Checkbox.main.js.map +1 -1
  18. package/dist/Checkbox.mjs +10 -5
  19. package/dist/Checkbox.module.js +10 -5
  20. package/dist/Checkbox.module.js.map +1 -1
  21. package/dist/Collection.main.js.map +1 -1
  22. package/dist/Collection.module.js.map +1 -1
  23. package/dist/ColorArea.main.js +4 -4
  24. package/dist/ColorArea.main.js.map +1 -1
  25. package/dist/ColorArea.mjs +5 -5
  26. package/dist/ColorArea.module.js +5 -5
  27. package/dist/ColorArea.module.js.map +1 -1
  28. package/dist/ColorField.main.js +14 -1
  29. package/dist/ColorField.main.js.map +1 -1
  30. package/dist/ColorField.mjs +14 -1
  31. package/dist/ColorField.module.js +14 -1
  32. package/dist/ColorField.module.js.map +1 -1
  33. package/dist/ColorSlider.main.js +3 -1
  34. package/dist/ColorSlider.main.js.map +1 -1
  35. package/dist/ColorSlider.mjs +3 -1
  36. package/dist/ColorSlider.module.js +3 -1
  37. package/dist/ColorSlider.module.js.map +1 -1
  38. package/dist/ColorSwatch.main.js +6 -2
  39. package/dist/ColorSwatch.main.js.map +1 -1
  40. package/dist/ColorSwatch.mjs +6 -2
  41. package/dist/ColorSwatch.module.js +6 -2
  42. package/dist/ColorSwatch.module.js.map +1 -1
  43. package/dist/ColorSwatchPicker.main.js.map +1 -1
  44. package/dist/ColorSwatchPicker.module.js.map +1 -1
  45. package/dist/ColorThumb.main.js +3 -1
  46. package/dist/ColorThumb.main.js.map +1 -1
  47. package/dist/ColorThumb.mjs +3 -1
  48. package/dist/ColorThumb.module.js +3 -1
  49. package/dist/ColorThumb.module.js.map +1 -1
  50. package/dist/ColorWheel.main.js +3 -1
  51. package/dist/ColorWheel.main.js.map +1 -1
  52. package/dist/ColorWheel.mjs +3 -1
  53. package/dist/ColorWheel.module.js +3 -1
  54. package/dist/ColorWheel.module.js.map +1 -1
  55. package/dist/ComboBox.main.js +4 -1
  56. package/dist/ComboBox.main.js.map +1 -1
  57. package/dist/ComboBox.mjs +4 -1
  58. package/dist/ComboBox.module.js +4 -1
  59. package/dist/ComboBox.module.js.map +1 -1
  60. package/dist/DateField.main.js +16 -3
  61. package/dist/DateField.main.js.map +1 -1
  62. package/dist/DateField.mjs +16 -3
  63. package/dist/DateField.module.js +16 -3
  64. package/dist/DateField.module.js.map +1 -1
  65. package/dist/DatePicker.main.js +15 -8
  66. package/dist/DatePicker.main.js.map +1 -1
  67. package/dist/DatePicker.mjs +16 -9
  68. package/dist/DatePicker.module.js +16 -9
  69. package/dist/DatePicker.module.js.map +1 -1
  70. package/dist/Dialog.main.js +4 -3
  71. package/dist/Dialog.main.js.map +1 -1
  72. package/dist/Dialog.mjs +5 -4
  73. package/dist/Dialog.module.js +5 -4
  74. package/dist/Dialog.module.js.map +1 -1
  75. package/dist/Disclosure.main.js +12 -10
  76. package/dist/Disclosure.main.js.map +1 -1
  77. package/dist/Disclosure.mjs +13 -11
  78. package/dist/Disclosure.module.js +13 -11
  79. package/dist/Disclosure.module.js.map +1 -1
  80. package/dist/DragAndDrop.main.js +31 -3
  81. package/dist/DragAndDrop.main.js.map +1 -1
  82. package/dist/DragAndDrop.mjs +31 -3
  83. package/dist/DragAndDrop.module.js +31 -3
  84. package/dist/DragAndDrop.module.js.map +1 -1
  85. package/dist/DropZone.main.js +4 -3
  86. package/dist/DropZone.main.js.map +1 -1
  87. package/dist/DropZone.mjs +4 -3
  88. package/dist/DropZone.module.js +4 -3
  89. package/dist/DropZone.module.js.map +1 -1
  90. package/dist/FieldError.main.js +3 -1
  91. package/dist/FieldError.main.js.map +1 -1
  92. package/dist/FieldError.mjs +3 -1
  93. package/dist/FieldError.module.js +3 -1
  94. package/dist/FieldError.module.js.map +1 -1
  95. package/dist/FileTrigger.main.js +3 -1
  96. package/dist/FileTrigger.main.js.map +1 -1
  97. package/dist/FileTrigger.mjs +3 -1
  98. package/dist/FileTrigger.module.js +3 -1
  99. package/dist/FileTrigger.module.js.map +1 -1
  100. package/dist/Form.main.js.map +1 -1
  101. package/dist/Form.module.js.map +1 -1
  102. package/dist/GridList.main.js +20 -13
  103. package/dist/GridList.main.js.map +1 -1
  104. package/dist/GridList.mjs +21 -14
  105. package/dist/GridList.module.js +21 -14
  106. package/dist/GridList.module.js.map +1 -1
  107. package/dist/HiddenDateInput.main.js +118 -0
  108. package/dist/HiddenDateInput.main.js.map +1 -0
  109. package/dist/HiddenDateInput.mjs +109 -0
  110. package/dist/HiddenDateInput.module.js +109 -0
  111. package/dist/HiddenDateInput.module.js.map +1 -0
  112. package/dist/Link.main.js +7 -1
  113. package/dist/Link.main.js.map +1 -1
  114. package/dist/Link.mjs +7 -1
  115. package/dist/Link.module.js +7 -1
  116. package/dist/Link.module.js.map +1 -1
  117. package/dist/ListBox.main.js +22 -19
  118. package/dist/ListBox.main.js.map +1 -1
  119. package/dist/ListBox.mjs +23 -20
  120. package/dist/ListBox.module.js +23 -20
  121. package/dist/ListBox.module.js.map +1 -1
  122. package/dist/Menu.main.js +15 -8
  123. package/dist/Menu.main.js.map +1 -1
  124. package/dist/Menu.mjs +16 -9
  125. package/dist/Menu.module.js +16 -9
  126. package/dist/Menu.module.js.map +1 -1
  127. package/dist/Meter.main.js +6 -2
  128. package/dist/Meter.main.js.map +1 -1
  129. package/dist/Meter.mjs +6 -2
  130. package/dist/Meter.module.js +6 -2
  131. package/dist/Meter.module.js.map +1 -1
  132. package/dist/Modal.main.js +31 -6
  133. package/dist/Modal.main.js.map +1 -1
  134. package/dist/Modal.mjs +31 -6
  135. package/dist/Modal.module.js +31 -6
  136. package/dist/Modal.module.js.map +1 -1
  137. package/dist/NumberField.main.js +4 -1
  138. package/dist/NumberField.main.js.map +1 -1
  139. package/dist/NumberField.mjs +4 -1
  140. package/dist/NumberField.module.js +4 -1
  141. package/dist/NumberField.module.js.map +1 -1
  142. package/dist/Popover.main.js +3 -1
  143. package/dist/Popover.main.js.map +1 -1
  144. package/dist/Popover.mjs +3 -1
  145. package/dist/Popover.module.js +3 -1
  146. package/dist/Popover.module.js.map +1 -1
  147. package/dist/ProgressBar.main.js +6 -2
  148. package/dist/ProgressBar.main.js.map +1 -1
  149. package/dist/ProgressBar.mjs +6 -2
  150. package/dist/ProgressBar.module.js +6 -2
  151. package/dist/ProgressBar.module.js.map +1 -1
  152. package/dist/RadioGroup.main.js +8 -3
  153. package/dist/RadioGroup.main.js.map +1 -1
  154. package/dist/RadioGroup.mjs +9 -4
  155. package/dist/RadioGroup.module.js +9 -4
  156. package/dist/RadioGroup.module.js.map +1 -1
  157. package/dist/SearchField.main.js +3 -1
  158. package/dist/SearchField.main.js.map +1 -1
  159. package/dist/SearchField.mjs +3 -1
  160. package/dist/SearchField.module.js +3 -1
  161. package/dist/SearchField.module.js.map +1 -1
  162. package/dist/Select.main.js +12 -14
  163. package/dist/Select.main.js.map +1 -1
  164. package/dist/Select.mjs +13 -15
  165. package/dist/Select.module.js +13 -15
  166. package/dist/Select.module.js.map +1 -1
  167. package/dist/Separator.main.js +4 -2
  168. package/dist/Separator.main.js.map +1 -1
  169. package/dist/Separator.mjs +5 -3
  170. package/dist/Separator.module.js +5 -3
  171. package/dist/Separator.module.js.map +1 -1
  172. package/dist/Slider.main.js +7 -5
  173. package/dist/Slider.main.js.map +1 -1
  174. package/dist/Slider.mjs +8 -6
  175. package/dist/Slider.module.js +8 -6
  176. package/dist/Slider.module.js.map +1 -1
  177. package/dist/Switch.main.js +4 -1
  178. package/dist/Switch.main.js.map +1 -1
  179. package/dist/Switch.mjs +4 -1
  180. package/dist/Switch.module.js +4 -1
  181. package/dist/Switch.module.js.map +1 -1
  182. package/dist/Table.main.js +47 -26
  183. package/dist/Table.main.js.map +1 -1
  184. package/dist/Table.mjs +48 -27
  185. package/dist/Table.module.js +48 -27
  186. package/dist/Table.module.js.map +1 -1
  187. package/dist/Tabs.main.js +22 -11
  188. package/dist/Tabs.main.js.map +1 -1
  189. package/dist/Tabs.mjs +23 -12
  190. package/dist/Tabs.module.js +23 -12
  191. package/dist/Tabs.module.js.map +1 -1
  192. package/dist/TagGroup.main.js +14 -8
  193. package/dist/TagGroup.main.js.map +1 -1
  194. package/dist/TagGroup.mjs +14 -8
  195. package/dist/TagGroup.module.js +14 -8
  196. package/dist/TagGroup.module.js.map +1 -1
  197. package/dist/TextField.main.js +13 -1
  198. package/dist/TextField.main.js.map +1 -1
  199. package/dist/TextField.mjs +13 -1
  200. package/dist/TextField.module.js +13 -1
  201. package/dist/TextField.module.js.map +1 -1
  202. package/dist/Toast.main.js +9 -5
  203. package/dist/Toast.main.js.map +1 -1
  204. package/dist/Toast.mjs +9 -5
  205. package/dist/Toast.module.js +9 -5
  206. package/dist/Toast.module.js.map +1 -1
  207. package/dist/ToggleButton.main.js +8 -2
  208. package/dist/ToggleButton.main.js.map +1 -1
  209. package/dist/ToggleButton.mjs +8 -2
  210. package/dist/ToggleButton.module.js +8 -2
  211. package/dist/ToggleButton.module.js.map +1 -1
  212. package/dist/ToggleButtonGroup.main.js +6 -2
  213. package/dist/ToggleButtonGroup.main.js.map +1 -1
  214. package/dist/ToggleButtonGroup.mjs +6 -2
  215. package/dist/ToggleButtonGroup.module.js +6 -2
  216. package/dist/ToggleButtonGroup.module.js.map +1 -1
  217. package/dist/Toolbar.main.js +4 -3
  218. package/dist/Toolbar.main.js.map +1 -1
  219. package/dist/Toolbar.mjs +4 -3
  220. package/dist/Toolbar.module.js +4 -3
  221. package/dist/Toolbar.module.js.map +1 -1
  222. package/dist/Tooltip.main.js +5 -3
  223. package/dist/Tooltip.main.js.map +1 -1
  224. package/dist/Tooltip.mjs +5 -3
  225. package/dist/Tooltip.module.js +5 -3
  226. package/dist/Tooltip.module.js.map +1 -1
  227. package/dist/Tree.main.js +73 -26
  228. package/dist/Tree.main.js.map +1 -1
  229. package/dist/Tree.mjs +74 -27
  230. package/dist/Tree.module.js +74 -27
  231. package/dist/Tree.module.js.map +1 -1
  232. package/dist/TreeDropTargetDelegate.main.js +8 -5
  233. package/dist/TreeDropTargetDelegate.main.js.map +1 -1
  234. package/dist/TreeDropTargetDelegate.mjs +8 -5
  235. package/dist/TreeDropTargetDelegate.module.js +8 -5
  236. package/dist/TreeDropTargetDelegate.module.js.map +1 -1
  237. package/dist/import.mjs +5 -5
  238. package/dist/main.js +4 -4
  239. package/dist/main.js.map +1 -1
  240. package/dist/module.js +5 -5
  241. package/dist/module.js.map +1 -1
  242. package/dist/types.d.ts +212 -203
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/useDragAndDrop.main.js.map +1 -1
  245. package/dist/useDragAndDrop.module.js.map +1 -1
  246. package/dist/utils.main.js.map +1 -1
  247. package/dist/utils.module.js.map +1 -1
  248. package/i18n/de-DE.js +1 -1
  249. package/i18n/de-DE.mjs +1 -1
  250. package/package.json +25 -25
  251. package/src/Breadcrumbs.tsx +10 -6
  252. package/src/Button.tsx +8 -30
  253. package/src/Calendar.tsx +41 -24
  254. package/src/Checkbox.tsx +8 -6
  255. package/src/Collection.tsx +2 -2
  256. package/src/ColorArea.tsx +5 -6
  257. package/src/ColorField.tsx +6 -4
  258. package/src/ColorSlider.tsx +3 -2
  259. package/src/ColorSwatch.tsx +6 -3
  260. package/src/ColorSwatchPicker.tsx +3 -3
  261. package/src/ColorThumb.tsx +3 -3
  262. package/src/ColorWheel.tsx +6 -5
  263. package/src/ComboBox.tsx +4 -4
  264. package/src/DateField.tsx +15 -10
  265. package/src/DatePicker.tsx +14 -12
  266. package/src/Dialog.tsx +6 -6
  267. package/src/Disclosure.tsx +10 -14
  268. package/src/DragAndDrop.tsx +31 -1
  269. package/src/DropZone.tsx +4 -5
  270. package/src/FieldError.tsx +3 -3
  271. package/src/FileTrigger.tsx +4 -3
  272. package/src/Form.tsx +2 -1
  273. package/src/GridList.tsx +25 -18
  274. package/src/HiddenDateInput.tsx +142 -0
  275. package/src/Link.tsx +7 -3
  276. package/src/ListBox.tsx +30 -26
  277. package/src/Menu.tsx +15 -12
  278. package/src/Meter.tsx +6 -3
  279. package/src/Modal.tsx +16 -5
  280. package/src/NumberField.tsx +4 -4
  281. package/src/Popover.tsx +3 -3
  282. package/src/ProgressBar.tsx +6 -2
  283. package/src/RadioGroup.tsx +8 -6
  284. package/src/SearchField.tsx +3 -2
  285. package/src/Select.tsx +13 -16
  286. package/src/Separator.tsx +6 -4
  287. package/src/Slider.tsx +9 -11
  288. package/src/Switch.tsx +4 -3
  289. package/src/Table.tsx +58 -56
  290. package/src/Tabs.tsx +20 -16
  291. package/src/TagGroup.tsx +13 -12
  292. package/src/TextField.tsx +5 -2
  293. package/src/Toast.tsx +10 -8
  294. package/src/ToggleButton.tsx +8 -4
  295. package/src/ToggleButtonGroup.tsx +6 -4
  296. package/src/Toolbar.tsx +4 -5
  297. package/src/Tooltip.tsx +6 -5
  298. package/src/Tree.tsx +90 -42
  299. package/src/TreeDropTargetDelegate.ts +5 -1
  300. package/src/index.ts +8 -8
  301. package/src/useDragAndDrop.tsx +2 -2
  302. package/src/utils.tsx +9 -9
package/src/Table.tsx CHANGED
@@ -1,16 +1,16 @@
1
- import {AriaLabelingProps, HoverEvents, Key, LinkDOMProps, RefObject} from '@react-types/shared';
1
+ import {AriaLabelingProps, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, PressEvents, RefObject} from '@react-types/shared';
2
2
  import {BaseCollection, Collection, CollectionBuilder, CollectionNode, createBranchComponent, createLeafComponent, useCachedChildren} from '@react-aria/collections';
3
3
  import {buildHeaderRows, TableColumnResizeState} from '@react-stately/table';
4
4
  import {ButtonContext} from './Button';
5
5
  import {CheckboxContext} from './RSPContexts';
6
6
  import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, ItemRenderProps} from './Collection';
7
7
  import {ColumnSize, ColumnStaticSize, TableCollection as ITableCollection, TableProps as SharedTableProps} from '@react-types/table';
8
- import {ContextValue, DEFAULT_SLOT, DOMProps, Provider, RenderProps, ScrollableProps, SlotProps, StyleProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
8
+ import {ContextValue, DEFAULT_SLOT, DOMProps, Provider, RenderProps, SlotProps, StyleProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
9
9
  import {DisabledBehavior, DraggableCollectionState, DroppableCollectionState, MultipleSelectionState, Node, SelectionBehavior, SelectionMode, SortDirection, TableState, useMultipleSelectionState, useTableColumnResizeState, useTableState} from 'react-stately';
10
10
  import {DragAndDropContext, DropIndicatorContext, DropIndicatorProps, useDndPersistedKeys, useRenderDropIndicator} from './DragAndDrop';
11
11
  import {DragAndDropHooks} from './useDragAndDrop';
12
12
  import {DraggableItemResult, DragPreviewRenderer, DropIndicatorAria, DroppableCollectionResult, FocusScope, ListKeyboardDelegate, mergeProps, useFocusRing, useHover, useLocale, useLocalizedStringFormatter, useTable, useTableCell, useTableColumnHeader, useTableColumnResize, useTableHeaderRow, useTableRow, useTableRowGroup, useTableSelectAllCheckbox, useTableSelectionCheckbox, useVisuallyHidden} from 'react-aria';
13
- import {filterDOMProps, inertValue, isScrollable, LoadMoreSentinelProps, mergeRefs, UNSTABLE_useLoadMoreSentinel, useLayoutEffect, useObjectRef, useResizeObserver} from '@react-aria/utils';
13
+ import {filterDOMProps, inertValue, isScrollable, LoadMoreSentinelProps, mergeRefs, useLayoutEffect, useLoadMoreSentinel, useObjectRef, useResizeObserver} from '@react-aria/utils';
14
14
  import {GridNode} from '@react-types/grid';
15
15
  // @ts-ignore
16
16
  import intlMessages from '../intl/*.json';
@@ -110,10 +110,6 @@ class TableCollection<T> extends BaseCollection<T> implements ITableCollection<T
110
110
  yield this.body;
111
111
  }
112
112
 
113
- get size() {
114
- return this.rows.length;
115
- }
116
-
117
113
  getFirstKey() {
118
114
  return this.body.firstChildKey;
119
115
  }
@@ -209,7 +205,7 @@ interface ResizableTableContainerContextValue {
209
205
 
210
206
  const ResizableTableContainerContext = createContext<ResizableTableContainerContextValue | null>(null);
211
207
 
212
- export interface ResizableTableContainerProps extends DOMProps, ScrollableProps<HTMLDivElement> {
208
+ export interface ResizableTableContainerProps extends DOMProps, GlobalDOMAttributes<HTMLDivElement> {
213
209
  /**
214
210
  * Handler that is called when a user starts a column resize.
215
211
  */
@@ -270,7 +266,7 @@ export const ResizableTableContainer = forwardRef(function ResizableTableContain
270
266
 
271
267
  return (
272
268
  <div
273
- {...filterDOMProps(props as any)}
269
+ {...filterDOMProps(props, {global: true})}
274
270
  ref={containerRef}
275
271
  className={props.className || 'react-aria-ResizableTableContainer'}
276
272
  style={props.style}
@@ -282,7 +278,7 @@ export const ResizableTableContainer = forwardRef(function ResizableTableContain
282
278
  );
283
279
  });
284
280
 
285
- export const TableContext = createContext<ContextValue<TableProps, HTMLTableElement>>(null);
281
+ export const TableContext = createContext<ContextValue<TableProps, HTMLTableElement | HTMLDivElement>>(null);
286
282
  export const TableStateContext = createContext<TableState<any> | null>(null);
287
283
  export const TableColumnResizeStateContext = createContext<TableColumnResizeState<unknown> | null>(null);
288
284
 
@@ -308,7 +304,7 @@ export interface TableRenderProps {
308
304
  state: TableState<unknown>
309
305
  }
310
306
 
311
- export interface TableProps extends Omit<SharedTableProps<any>, 'children'>, StyleRenderProps<TableRenderProps>, SlotProps, AriaLabelingProps, ScrollableProps<HTMLTableElement> {
307
+ export interface TableProps extends Omit<SharedTableProps<any>, 'children'>, StyleRenderProps<TableRenderProps>, SlotProps, AriaLabelingProps, GlobalDOMAttributes<HTMLTableElement> {
312
308
  /** The elements that make up the table. Includes the TableHeader, TableBody, Columns, and Rows. */
313
309
  children?: ReactNode,
314
310
  /**
@@ -331,7 +327,7 @@ export interface TableProps extends Omit<SharedTableProps<any>, 'children'>, Sty
331
327
  * A table displays data in rows and columns and enables a user to navigate its contents via directional navigation keys,
332
328
  * and optionally supports row selection and sorting.
333
329
  */
334
- export const Table = forwardRef(function Table(props: TableProps, ref: ForwardedRef<HTMLTableElement>) {
330
+ export const Table = forwardRef(function Table(props: TableProps, ref: ForwardedRef<HTMLTableElement | HTMLDivElement>) {
335
331
  [props, ref] = useContextProps(props, ref, TableContext);
336
332
 
337
333
  // Separate selection state so we have access to it from collection components via useTableOptions.
@@ -353,7 +349,7 @@ export const Table = forwardRef(function Table(props: TableProps, ref: Forwarded
353
349
 
354
350
  return (
355
351
  <CollectionBuilder content={content} createCollection={() => new TableCollection<any>()}>
356
- {collection => <TableInner props={props} forwardedRef={ref} selectionState={selectionState} collection={collection} />}
352
+ {collection => <TableInner props={props} forwardedRef={ref as any} selectionState={selectionState} collection={collection} />}
357
353
  </CollectionBuilder>
358
354
  );
359
355
  });
@@ -474,6 +470,7 @@ function TableInner({props, forwardedRef: ref, selectionState, collection}: Tabl
474
470
  }
475
471
 
476
472
  let ElementType = useElementType('table');
473
+ let DOMProps = filterDOMProps(props, {global: true});
477
474
 
478
475
  return (
479
476
  <Provider
@@ -485,9 +482,7 @@ function TableInner({props, forwardedRef: ref, selectionState, collection}: Tabl
485
482
  ]}>
486
483
  <FocusScope>
487
484
  <ElementType
488
- {...filterDOMProps(props)}
489
- {...renderProps}
490
- {...mergeProps(gridProps, focusProps, droppableCollection?.collectionProps)}
485
+ {...mergeProps(DOMProps, renderProps, gridProps, focusProps, droppableCollection?.collectionProps)}
491
486
  style={style}
492
487
  ref={ref}
493
488
  slot={props.slot || undefined}
@@ -540,7 +535,7 @@ export interface TableHeaderRenderProps {
540
535
  isHovered: boolean
541
536
  }
542
537
 
543
- export interface TableHeaderProps<T> extends StyleRenderProps<TableHeaderRenderProps>, HoverEvents {
538
+ export interface TableHeaderProps<T> extends StyleRenderProps<TableHeaderRenderProps>, HoverEvents, GlobalDOMAttributes<HTMLTableSectionElement> {
544
539
  /** A list of table columns. */
545
540
  columns?: Iterable<T>,
546
541
  /** A list of `Column(s)` or a function. If the latter, a list of columns must be provided using the `columns` prop. */
@@ -554,7 +549,7 @@ export interface TableHeaderProps<T> extends StyleRenderProps<TableHeaderRenderP
554
549
  */
555
550
  export const TableHeader = /*#__PURE__*/ createBranchComponent(
556
551
  'tableheader',
557
- <T extends object>(props: TableHeaderProps<T>, ref: ForwardedRef<HTMLTableSectionElement>) => {
552
+ <T extends object>(props: TableHeaderProps<T>, ref: ForwardedRef<HTMLTableSectionElement | HTMLDivElement>) => {
558
553
  let collection = useContext(TableStateContext)!.collection as TableCollection<unknown>;
559
554
  let headerRows = useCachedChildren({
560
555
  items: collection.headerRows,
@@ -587,9 +582,9 @@ export const TableHeader = /*#__PURE__*/ createBranchComponent(
587
582
 
588
583
  return (
589
584
  <THead
590
- {...mergeProps(filterDOMProps(props as any), rowGroupProps, hoverProps)}
585
+ {...mergeProps(filterDOMProps(props, {global: true}), rowGroupProps, hoverProps)}
591
586
  {...renderProps}
592
- ref={ref}
587
+ ref={ref as any}
593
588
  data-hovered={isHovered || undefined}>
594
589
  {headerRows}
595
590
  </THead>
@@ -667,7 +662,7 @@ export interface ColumnRenderProps {
667
662
  startResize(): void
668
663
  }
669
664
 
670
- export interface ColumnProps extends RenderProps<ColumnRenderProps> {
665
+ export interface ColumnProps extends RenderProps<ColumnRenderProps>, GlobalDOMAttributes<HTMLTableHeaderCellElement> {
671
666
  /** The unique id of the column. */
672
667
  id?: Key,
673
668
  /** Whether the column allows sorting. */
@@ -689,8 +684,8 @@ export interface ColumnProps extends RenderProps<ColumnRenderProps> {
689
684
  /**
690
685
  * A column within a `<Table>`.
691
686
  */
692
- export const Column = /*#__PURE__*/ createLeafComponent('column', (props: ColumnProps, forwardedRef: ForwardedRef<HTMLTableCellElement>, column: GridNode<unknown>) => {
693
- let ref = useObjectRef<HTMLTableHeaderCellElement>(forwardedRef);
687
+ export const Column = /*#__PURE__*/ createLeafComponent('column', (props: ColumnProps, forwardedRef: ForwardedRef<HTMLTableCellElement | HTMLDivElement>, column: GridNode<unknown>) => {
688
+ let ref = useObjectRef<HTMLTableCellElement | HTMLDivElement>(forwardedRef);
694
689
  let state = useContext(TableStateContext)!;
695
690
  let {isVirtualized} = useContext(CollectionRendererContext);
696
691
  let {columnHeaderProps} = useTableColumnHeader(
@@ -747,13 +742,15 @@ export const Column = /*#__PURE__*/ createLeafComponent('column', (props: Column
747
742
  }
748
743
 
749
744
  let TH = useElementType('th');
745
+ let DOMProps = filterDOMProps(props as any, {global: true});
746
+ delete DOMProps.id;
750
747
 
751
748
  return (
752
749
  <TH
753
- {...mergeProps(filterDOMProps(props as any), columnHeaderProps, focusProps, hoverProps)}
750
+ {...mergeProps(DOMProps, columnHeaderProps, focusProps, hoverProps)}
754
751
  {...renderProps}
755
752
  style={style}
756
- ref={ref}
753
+ ref={ref as any}
757
754
  data-hovered={isHovered || undefined}
758
755
  data-focused={isFocused || undefined}
759
756
  data-focus-visible={isFocusVisible || undefined}
@@ -799,7 +796,7 @@ export interface ColumnResizerRenderProps {
799
796
  resizableDirection: 'right' | 'left' | 'both'
800
797
  }
801
798
 
802
- export interface ColumnResizerProps extends HoverEvents, RenderProps<ColumnResizerRenderProps> {
799
+ export interface ColumnResizerProps extends HoverEvents, RenderProps<ColumnResizerRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
803
800
  /** A custom accessibility label for the resizer. */
804
801
  'aria-label'?: string
805
802
  }
@@ -881,13 +878,13 @@ export const ColumnResizer = forwardRef(function ColumnResizer(props: ColumnResi
881
878
  setMouseDown(false);
882
879
  }
883
880
 
881
+ let DOMProps = filterDOMProps(props, {global: true});
882
+
884
883
  return (
885
884
  <div
886
885
  ref={objectRef}
887
886
  role="presentation"
888
- {...filterDOMProps(props as any)}
889
- {...renderProps}
890
- {...mergeProps(resizerProps, {onPointerDown}, hoverProps)}
887
+ {...mergeProps(DOMProps, renderProps, resizerProps, {onPointerDown}, hoverProps)}
891
888
  data-hovered={isHovered || undefined}
892
889
  data-focused={isFocused || undefined}
893
890
  data-focus-visible={isFocusVisible || undefined}
@@ -915,14 +912,14 @@ export interface TableBodyRenderProps {
915
912
  isDropTarget: boolean
916
913
  }
917
914
 
918
- export interface TableBodyProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TableBodyRenderProps> {
915
+ export interface TableBodyProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TableBodyRenderProps>, GlobalDOMAttributes<HTMLTableSectionElement> {
919
916
  /** Provides content to display when there are no rows in the table. */
920
917
  renderEmptyState?: (props: TableBodyRenderProps) => ReactNode
921
918
  }
922
919
  /**
923
920
  * The body of a `<Table>`, containing the table rows.
924
921
  */
925
- export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T extends object>(props: TableBodyProps<T>, ref: ForwardedRef<HTMLTableSectionElement>) => {
922
+ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T extends object>(props: TableBodyProps<T>, ref: ForwardedRef<HTMLTableSectionElement | HTMLDivElement>) => {
926
923
  let state = useContext(TableStateContext)!;
927
924
  let {isVirtualized} = useContext(CollectionRendererContext);
928
925
  let collection = state.collection;
@@ -931,7 +928,7 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
931
928
  let isDroppable = !!dragAndDropHooks?.useDroppableCollectionState && !dropState?.isDisabled;
932
929
  let isRootDropTarget = isDroppable && !!dropState && (dropState.isDropTarget({type: 'root'}) ?? false);
933
930
 
934
- let isEmpty = collection.size === 0 || (collection.rows.length === 1 && collection.rows[0].type === 'loader');
931
+ let isEmpty = collection.size === 0;
935
932
  let renderValues = {
936
933
  isDropTarget: isRootDropTarget,
937
934
  isEmpty
@@ -954,7 +951,6 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
954
951
  let rowHeaderProps = {};
955
952
  let style = {};
956
953
  if (isVirtualized) {
957
- rowProps['aria-rowindex'] = collection.headerRows.length + 1;
958
954
  rowHeaderProps['aria-colspan'] = numColumns;
959
955
  style = {display: 'contents'};
960
956
  } else {
@@ -973,13 +969,14 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
973
969
  let {rowGroupProps} = useTableRowGroup();
974
970
  let TBody = useElementType('tbody');
975
971
 
972
+ let DOMProps = filterDOMProps(props, {global: true});
973
+
976
974
  // TODO: TableBody doesn't support being the scrollable body of the table yet, to revisit if needed. Would need to
977
975
  // call useLoadMore here and walk up the DOM to the nearest scrollable element to set scrollRef
978
976
  return (
979
977
  <TBody
980
- {...mergeProps(filterDOMProps(props as any), rowGroupProps)}
981
- {...renderProps}
982
- ref={ref}
978
+ {...mergeProps(DOMProps, renderProps, rowGroupProps)}
979
+ ref={ref as any}
983
980
  data-empty={isEmpty || undefined}>
984
981
  {isDroppable && <RootDropIndicator />}
985
982
  <CollectionBranch
@@ -998,7 +995,7 @@ export interface RowRenderProps extends ItemRenderProps {
998
995
  id?: Key
999
996
  }
1000
997
 
1001
- export interface RowProps<T> extends StyleRenderProps<RowRenderProps>, LinkDOMProps, HoverEvents {
998
+ export interface RowProps<T> extends StyleRenderProps<RowRenderProps>, LinkDOMProps, HoverEvents, PressEvents, Omit<GlobalDOMAttributes<HTMLTableRowElement>, 'onClick'> {
1002
999
  /** A list of columns used when dynamically rendering cells. */
1003
1000
  columns?: Iterable<T>,
1004
1001
  /** The cells within the row. Supports static items or a function for dynamic rendering. */
@@ -1025,8 +1022,8 @@ export interface RowProps<T> extends StyleRenderProps<RowRenderProps>, LinkDOMPr
1025
1022
  */
1026
1023
  export const Row = /*#__PURE__*/ createBranchComponent(
1027
1024
  'item',
1028
- <T extends object>(props: RowProps<T>, forwardedRef: ForwardedRef<HTMLTableRowElement>, item: GridNode<T>) => {
1029
- let ref = useObjectRef<HTMLTableRowElement>(forwardedRef);
1025
+ <T extends object>(props: RowProps<T>, forwardedRef: ForwardedRef<HTMLTableRowElement | HTMLDivElement>, item: GridNode<T>) => {
1026
+ let ref = useObjectRef<HTMLTableRowElement | HTMLDivElement>(forwardedRef);
1030
1027
  let state = useContext(TableStateContext)!;
1031
1028
  let {dragAndDropHooks, dragState, dropState} = useContext(DragAndDropContext);
1032
1029
  let {isVirtualized, CollectionBranch} = useContext(CollectionRendererContext);
@@ -1101,6 +1098,9 @@ export const Row = /*#__PURE__*/ createBranchComponent(
1101
1098
 
1102
1099
  let TR = useElementType('tr');
1103
1100
  let TD = useElementType('td');
1101
+ let DOMProps = filterDOMProps(props as any, {global: true});
1102
+ delete DOMProps.id;
1103
+ delete DOMProps.onClick;
1104
1104
 
1105
1105
  return (
1106
1106
  <>
@@ -1112,9 +1112,8 @@ export const Row = /*#__PURE__*/ createBranchComponent(
1112
1112
  </TR>
1113
1113
  )}
1114
1114
  <TR
1115
- {...mergeProps(filterDOMProps(props as any), rowProps, focusProps, hoverProps, draggableItem?.dragProps, focusWithinProps)}
1116
- {...renderProps}
1117
- ref={ref}
1115
+ {...mergeProps(DOMProps, renderProps, rowProps, focusProps, hoverProps, draggableItem?.dragProps, focusWithinProps)}
1116
+ ref={ref as any}
1118
1117
  data-disabled={states.isDisabled || undefined}
1119
1118
  data-selected={states.isSelected || undefined}
1120
1119
  data-hovered={isHovered || undefined}
@@ -1193,7 +1192,7 @@ export interface CellRenderProps {
1193
1192
  id?: Key
1194
1193
  }
1195
1194
 
1196
- export interface CellProps extends RenderProps<CellRenderProps> {
1195
+ export interface CellProps extends RenderProps<CellRenderProps>, GlobalDOMAttributes<HTMLTableCellElement> {
1197
1196
  /** The unique id of the cell. */
1198
1197
  id?: Key,
1199
1198
  /** A string representation of the cell's contents, used for features like typeahead. */
@@ -1205,8 +1204,8 @@ export interface CellProps extends RenderProps<CellRenderProps> {
1205
1204
  /**
1206
1205
  * A cell within a table row.
1207
1206
  */
1208
- export const Cell = /*#__PURE__*/ createLeafComponent('cell', (props: CellProps, forwardedRef: ForwardedRef<HTMLTableCellElement>, cell: GridNode<unknown>) => {
1209
- let ref = useObjectRef<HTMLTableCellElement>(forwardedRef);
1207
+ export const Cell = /*#__PURE__*/ createLeafComponent('cell', (props: CellProps, forwardedRef: ForwardedRef<HTMLTableCellElement | HTMLDivElement>, cell: GridNode<unknown>) => {
1208
+ let ref = useObjectRef<HTMLTableCellElement | HTMLDivElement>(forwardedRef);
1210
1209
  let state = useContext(TableStateContext)!;
1211
1210
  let {dragState} = useContext(DragAndDropContext);
1212
1211
  let {isVirtualized} = useContext(CollectionRendererContext);
@@ -1235,12 +1234,13 @@ export const Cell = /*#__PURE__*/ createLeafComponent('cell', (props: CellProps,
1235
1234
  });
1236
1235
 
1237
1236
  let TD = useElementType('td');
1237
+ let DOMProps = filterDOMProps(props as any, {global: true});
1238
+ delete DOMProps.id;
1238
1239
 
1239
1240
  return (
1240
1241
  <TD
1241
- {...mergeProps(filterDOMProps(props as any), gridCellProps, focusProps, hoverProps)}
1242
- {...renderProps}
1243
- ref={ref}
1242
+ {...mergeProps(DOMProps, renderProps, gridCellProps, focusProps, hoverProps)}
1243
+ ref={ref as any}
1244
1244
  data-focused={isFocused || undefined}
1245
1245
  data-focus-visible={isFocusVisible || undefined}
1246
1246
  data-pressed={isPressed || undefined}>
@@ -1270,7 +1270,7 @@ function TableDropIndicatorWrapper(props: DropIndicatorProps, ref: ForwardedRef<
1270
1270
  );
1271
1271
  }
1272
1272
 
1273
- interface TableDropIndicatorProps extends DropIndicatorProps {
1273
+ interface TableDropIndicatorProps extends DropIndicatorProps, GlobalDOMAttributes<HTMLTableRowElement> {
1274
1274
  dropIndicatorProps: React.HTMLAttributes<HTMLElement>,
1275
1275
  isDropTarget: boolean,
1276
1276
  buttonRef: RefObject<HTMLDivElement | null>
@@ -1299,7 +1299,7 @@ function TableDropIndicator(props: TableDropIndicatorProps, ref: ForwardedRef<HT
1299
1299
 
1300
1300
  return (
1301
1301
  <TR
1302
- {...filterDOMProps(props as any)}
1302
+ {...filterDOMProps(props as any, {global: true})}
1303
1303
  {...renderProps}
1304
1304
  role="row"
1305
1305
  ref={ref as RefObject<HTMLTableRowElement | null>}
@@ -1348,7 +1348,7 @@ function RootDropIndicator() {
1348
1348
  );
1349
1349
  }
1350
1350
 
1351
- export interface TableLoadingSentinelProps extends Omit<LoadMoreSentinelProps, 'collection'>, StyleProps {
1351
+ export interface TableLoadMoreItemProps extends Omit<LoadMoreSentinelProps, 'collection'>, StyleProps, GlobalDOMAttributes<HTMLTableRowElement> {
1352
1352
  /**
1353
1353
  * The load more spinner to render when loading additional items.
1354
1354
  */
@@ -1359,7 +1359,7 @@ export interface TableLoadingSentinelProps extends Omit<LoadMoreSentinelProps, '
1359
1359
  isLoading?: boolean
1360
1360
  }
1361
1361
 
1362
- export const UNSTABLE_TableLoadingSentinel = createLeafComponent('loader', function TableLoadingIndicator<T extends object>(props: TableLoadingSentinelProps, ref: ForwardedRef<HTMLTableRowElement>, item: Node<T>) {
1362
+ export const TableLoadMoreItem = createLeafComponent('loader', function TableLoadingIndicator(props: TableLoadMoreItemProps, ref: ForwardedRef<HTMLTableRowElement>, item: Node<object>) {
1363
1363
  let state = useContext(TableStateContext)!;
1364
1364
  let {isVirtualized} = useContext(CollectionRendererContext);
1365
1365
  let {isLoading, onLoadMore, scrollOffset, ...otherProps} = props;
@@ -1372,7 +1372,7 @@ export const UNSTABLE_TableLoadingSentinel = createLeafComponent('loader', funct
1372
1372
  sentinelRef,
1373
1373
  scrollOffset
1374
1374
  }), [onLoadMore, scrollOffset, state?.collection]);
1375
- UNSTABLE_useLoadMoreSentinel(memoedLoadMoreProps, sentinelRef);
1375
+ useLoadMoreSentinel(memoedLoadMoreProps, sentinelRef);
1376
1376
 
1377
1377
  let renderProps = useRenderProps({
1378
1378
  ...otherProps,
@@ -1388,7 +1388,9 @@ export const UNSTABLE_TableLoadingSentinel = createLeafComponent('loader', funct
1388
1388
  let style = {};
1389
1389
 
1390
1390
  if (isVirtualized) {
1391
- rowProps['aria-rowindex'] = item.index + 1 + state.collection.headerRows.length;
1391
+ // For now don't include aria-rowindex on loader since they aren't keyboard focusable
1392
+ // Arguably shouldn't include them ever since it might be confusing to the user to include the loaders as part of the
1393
+ // row count
1392
1394
  rowHeaderProps['aria-colspan'] = numColumns;
1393
1395
  style = {display: 'contents'};
1394
1396
  } else {
@@ -1406,10 +1408,10 @@ export const UNSTABLE_TableLoadingSentinel = createLeafComponent('loader', funct
1406
1408
  </TR>
1407
1409
  {isLoading && renderProps.children && (
1408
1410
  <TR
1409
- {...mergeProps(filterDOMProps(props as any), rowProps)}
1411
+ {...mergeProps(filterDOMProps(props, {global: true}), rowProps)}
1410
1412
  {...renderProps}
1411
1413
  role="row"
1412
- ref={ref}>
1414
+ ref={ref as ForwardedRef<HTMLTableRowElement>}>
1413
1415
  <TD role="rowheader" {...rowHeaderProps} style={style}>
1414
1416
  {renderProps.children}
1415
1417
  </TD>
package/src/Tabs.tsx CHANGED
@@ -10,7 +10,7 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {AriaLabelingProps, forwardRefType, HoverEvents, Key, LinkDOMProps, RefObject} from '@react-types/shared';
13
+ import {AriaLabelingProps, forwardRefType, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, PressEvents, RefObject} from '@react-types/shared';
14
14
  import {AriaTabListProps, AriaTabPanelProps, mergeProps, Orientation, useFocusRing, useHover, useTab, useTabList, useTabPanel} from 'react-aria';
15
15
  import {Collection, CollectionBuilder, createHideableComponent, createLeafComponent} from '@react-aria/collections';
16
16
  import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, usePersistedKeys} from './Collection';
@@ -19,7 +19,7 @@ import {filterDOMProps, inertValue, useObjectRef} from '@react-aria/utils';
19
19
  import {Collection as ICollection, Node, TabListState, useTabListState} from 'react-stately';
20
20
  import React, {createContext, ForwardedRef, forwardRef, JSX, useContext, useMemo} from 'react';
21
21
 
22
- export interface TabsProps extends Omit<AriaTabListProps<any>, 'items' | 'children'>, RenderProps<TabsRenderProps>, SlotProps {}
22
+ export interface TabsProps extends Omit<AriaTabListProps<any>, 'items' | 'children'>, RenderProps<TabsRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
23
23
 
24
24
  export interface TabsRenderProps {
25
25
  /**
@@ -29,7 +29,7 @@ export interface TabsRenderProps {
29
29
  orientation: Orientation
30
30
  }
31
31
 
32
- export interface TabListProps<T> extends StyleRenderProps<TabListRenderProps>, AriaLabelingProps, Omit<CollectionProps<T>, 'disabledKeys'> {}
32
+ export interface TabListProps<T> extends StyleRenderProps<TabListRenderProps>, AriaLabelingProps, Omit<CollectionProps<T>, 'disabledKeys'>, GlobalDOMAttributes<HTMLDivElement> {}
33
33
 
34
34
  export interface TabListRenderProps {
35
35
  /**
@@ -43,7 +43,7 @@ export interface TabListRenderProps {
43
43
  state: TabListState<unknown>
44
44
  }
45
45
 
46
- export interface TabProps extends RenderProps<TabRenderProps>, AriaLabelingProps, LinkDOMProps, HoverEvents {
46
+ export interface TabProps extends RenderProps<TabRenderProps>, AriaLabelingProps, LinkDOMProps, HoverEvents, PressEvents, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
47
47
  /** The unique id of the tab. */
48
48
  id?: Key,
49
49
  /** Whether the tab is disabled. */
@@ -83,7 +83,7 @@ export interface TabRenderProps {
83
83
  isDisabled: boolean
84
84
  }
85
85
 
86
- export interface TabPanelProps extends AriaTabPanelProps, RenderProps<TabPanelRenderProps> {
86
+ export interface TabPanelProps extends AriaTabPanelProps, RenderProps<TabPanelRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
87
87
  /**
88
88
  * Whether to mount the tab panel in the DOM even when it is not currently selected.
89
89
  * Inactive tab panels are inert and cannot be interacted with. They must be styled appropriately so this is clear to the user visually.
@@ -162,11 +162,11 @@ function TabsInner({props, tabsRef: ref, collection}: TabsInnerProps) {
162
162
  values
163
163
  });
164
164
 
165
+ let DOMProps = filterDOMProps(props, {global: true});
166
+
165
167
  return (
166
168
  <div
167
- {...filterDOMProps(props as any)}
168
- {...focusProps}
169
- {...renderProps}
169
+ {...mergeProps(DOMProps, renderProps, focusProps)}
170
170
  ref={ref}
171
171
  slot={props.slot || undefined}
172
172
  data-focused={isFocused || undefined}
@@ -222,15 +222,13 @@ function TabListInner<T extends object>({props, forwardedRef: ref}: TabListInner
222
222
  }
223
223
  });
224
224
 
225
- let DOMProps = filterDOMProps(props);
225
+ let DOMProps = filterDOMProps(props, {global: true});
226
226
  delete DOMProps.id;
227
227
 
228
228
  return (
229
229
  <div
230
- {...DOMProps}
231
- {...tabListProps}
230
+ {...mergeProps(DOMProps, renderProps, tabListProps)}
232
231
  ref={objectRef}
233
- {...renderProps}
234
232
  data-orientation={orientation || undefined}>
235
233
  <CollectionRoot collection={state.collection} persistedKeys={usePersistedKeys(state.selectionManager.focusedKey)} />
236
234
  </div>
@@ -268,10 +266,13 @@ export const Tab = /*#__PURE__*/ createLeafComponent('item', (props: TabProps, f
268
266
  });
269
267
 
270
268
  let ElementType: React.ElementType = item.props.href ? 'a' : 'div';
269
+ let DOMProps = filterDOMProps(props as any, {global: true});
270
+ delete DOMProps.id;
271
+ delete DOMProps.onClick;
271
272
 
272
273
  return (
273
274
  <ElementType
274
- {...mergeProps(tabProps, focusProps, hoverProps, renderProps)}
275
+ {...mergeProps(DOMProps, renderProps, tabProps, focusProps, hoverProps)}
275
276
  ref={ref}
276
277
  data-selected={isSelected || undefined}
277
278
  data-disabled={isDisabled || undefined}
@@ -290,6 +291,8 @@ export const Tab = /*#__PURE__*/ createLeafComponent('item', (props: TabProps, f
290
291
  export const TabPanel = /*#__PURE__*/ createHideableComponent(function TabPanel(props: TabPanelProps, forwardedRef: ForwardedRef<HTMLDivElement>) {
291
292
  const state = useContext(TabListStateContext)!;
292
293
  let ref = useObjectRef<HTMLDivElement>(forwardedRef);
294
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
295
+ let {id, ...otherProps} = props;
293
296
  let {tabPanelProps} = useTabPanel(props, state, ref);
294
297
  let {focusProps, isFocused, isFocusVisible} = useFocusRing();
295
298
 
@@ -300,7 +303,8 @@ export const TabPanel = /*#__PURE__*/ createHideableComponent(function TabPanel(
300
303
  values: {
301
304
  isFocused,
302
305
  isFocusVisible,
303
- isInert: !isSelected,
306
+ // @ts-ignore - compatibility with React < 19
307
+ isInert: inertValue(!isSelected),
304
308
  state
305
309
  }
306
310
  });
@@ -309,7 +313,7 @@ export const TabPanel = /*#__PURE__*/ createHideableComponent(function TabPanel(
309
313
  return null;
310
314
  }
311
315
 
312
- let DOMProps = filterDOMProps(props);
316
+ let DOMProps = filterDOMProps(otherProps, {global: true});
313
317
  delete DOMProps.id;
314
318
 
315
319
  let domProps = isSelected
@@ -323,7 +327,7 @@ export const TabPanel = /*#__PURE__*/ createHideableComponent(function TabPanel(
323
327
  data-focused={isFocused || undefined}
324
328
  data-focus-visible={isFocusVisible || undefined}
325
329
  // @ts-ignore
326
- inert={inertValue(!isSelected)}
330
+ inert={inertValue(!isSelected || props.inert)}
327
331
  data-inert={!isSelected ? 'true' : undefined}>
328
332
  <Provider
329
333
  values={[
package/src/TagGroup.tsx CHANGED
@@ -16,14 +16,14 @@ import {Collection, CollectionBuilder, createLeafComponent} from '@react-aria/co
16
16
  import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, ItemRenderProps, usePersistedKeys} from './Collection';
17
17
  import {ContextValue, DOMProps, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlot} from './utils';
18
18
  import {filterDOMProps, mergeProps, useObjectRef} from '@react-aria/utils';
19
- import {forwardRefType, HoverEvents, Key, LinkDOMProps} from '@react-types/shared';
19
+ import {forwardRefType, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, PressEvents} from '@react-types/shared';
20
20
  import {LabelContext} from './Label';
21
21
  import {ListState, Node, useListState} from 'react-stately';
22
22
  import {ListStateContext} from './ListBox';
23
23
  import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useEffect, useRef} from 'react';
24
24
  import {TextContext} from './Text';
25
25
 
26
- export interface TagGroupProps extends Omit<AriaTagGroupProps<unknown>, 'children' | 'items' | 'label' | 'description' | 'errorMessage' | 'keyboardDelegate'>, DOMProps, SlotProps {}
26
+ export interface TagGroupProps extends Omit<AriaTagGroupProps<unknown>, 'children' | 'items' | 'label' | 'description' | 'errorMessage' | 'keyboardDelegate'>, DOMProps, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
27
27
 
28
28
  export interface TagListRenderProps {
29
29
  /**
@@ -47,7 +47,7 @@ export interface TagListRenderProps {
47
47
  state: ListState<unknown>
48
48
  }
49
49
 
50
- export interface TagListProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TagListRenderProps> {
50
+ export interface TagListProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TagListRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
51
51
  /** Provides content to display when there are no items in the tag list. */
52
52
  renderEmptyState?: (props: TagListRenderProps) => ReactNode
53
53
  }
@@ -85,7 +85,7 @@ function TagGroupInner({props, forwardedRef: ref, collection}: TagGroupInnerProp
85
85
  });
86
86
 
87
87
  // Prevent DOM props from going to two places.
88
- let domProps = filterDOMProps(props);
88
+ let domProps = filterDOMProps(props, {global: true});
89
89
  let domPropOverrides = Object.fromEntries(Object.entries(domProps).map(([k]) => [k, undefined]));
90
90
  let {
91
91
  gridProps,
@@ -141,9 +141,7 @@ interface TagListInnerProps<T> {
141
141
  function TagListInner<T extends object>({props, forwardedRef}: TagListInnerProps<T>) {
142
142
  let state = useContext(ListStateContext)!;
143
143
  let {CollectionRoot} = useContext(CollectionRendererContext);
144
- let [gridProps, ref] = useContextProps(props, forwardedRef, TagListContext);
145
- delete gridProps.items;
146
- delete gridProps.renderEmptyState;
144
+ let [gridProps, ref] = useContextProps({}, forwardedRef, TagListContext);
147
145
 
148
146
  let {focusProps, isFocused, isFocusVisible} = useFocusRing();
149
147
  let renderValues = {
@@ -160,11 +158,11 @@ function TagListInner<T extends object>({props, forwardedRef}: TagListInnerProps
160
158
  });
161
159
 
162
160
  let persistedKeys = usePersistedKeys(state.selectionManager.focusedKey);
161
+ let DOMProps = filterDOMProps(props, {global: true});
163
162
 
164
163
  return (
165
164
  <div
166
- {...mergeProps(gridProps, focusProps)}
167
- {...renderProps}
165
+ {...mergeProps(DOMProps, renderProps, gridProps, focusProps)}
168
166
  ref={ref}
169
167
  data-empty={state.collection.size === 0 || undefined}
170
168
  data-focused={isFocused || undefined}
@@ -184,7 +182,7 @@ export interface TagRenderProps extends Omit<ItemRenderProps, 'allowsDragging' |
184
182
  allowsRemoving: boolean
185
183
  }
186
184
 
187
- export interface TagProps extends RenderProps<TagRenderProps>, LinkDOMProps, HoverEvents {
185
+ export interface TagProps extends RenderProps<TagRenderProps>, LinkDOMProps, HoverEvents, PressEvents, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
188
186
  /** A unique id for the tag. */
189
187
  id?: Key,
190
188
  /**
@@ -232,11 +230,14 @@ export const Tag = /*#__PURE__*/ createLeafComponent('item', (props: TagProps, f
232
230
  }
233
231
  }, [item.textValue]);
234
232
 
233
+ let DOMProps = filterDOMProps(props as any, {global: true});
234
+ delete DOMProps.id;
235
+ delete DOMProps.onClick;
236
+
235
237
  return (
236
238
  <div
237
239
  ref={ref}
238
- {...renderProps}
239
- {...mergeProps(filterDOMProps(props as any), rowProps, focusProps, hoverProps)}
240
+ {...mergeProps(DOMProps, renderProps, rowProps, focusProps, hoverProps)}
240
241
  data-selected={states.isSelected || undefined}
241
242
  data-disabled={states.isDisabled || undefined}
242
243
  data-hovered={isHovered || undefined}
package/src/TextField.tsx CHANGED
@@ -16,6 +16,8 @@ import {createHideableComponent} from '@react-aria/collections';
16
16
  import {FieldErrorContext} from './FieldError';
17
17
  import {filterDOMProps, mergeProps} from '@react-aria/utils';
18
18
  import {FormContext} from './Form';
19
+ import {GlobalDOMAttributes} from '@react-types/shared';
20
+ import {GroupContext} from './Group';
19
21
  import {InputContext} from './Input';
20
22
  import {LabelContext} from './Label';
21
23
  import React, {createContext, ForwardedRef, useCallback, useRef, useState} from 'react';
@@ -45,7 +47,7 @@ export interface TextFieldRenderProps {
45
47
  isRequired: boolean
46
48
  }
47
49
 
48
- export interface TextFieldProps extends Omit<AriaTextFieldProps, 'label' | 'placeholder' | 'description' | 'errorMessage' | 'validationState' | 'validationBehavior'>, RACValidation, Omit<DOMProps, 'style' | 'className' | 'children'>, SlotProps, RenderProps<TextFieldRenderProps> {
50
+ export interface TextFieldProps extends Omit<AriaTextFieldProps, 'label' | 'placeholder' | 'description' | 'errorMessage' | 'validationState' | 'validationBehavior'>, RACValidation, Omit<DOMProps, 'style' | 'className' | 'children'>, SlotProps, RenderProps<TextFieldRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
49
51
  /** Whether the value is invalid. */
50
52
  isInvalid?: boolean
51
53
  }
@@ -92,7 +94,7 @@ export const TextField = /*#__PURE__*/ createHideableComponent(function TextFiel
92
94
  defaultClassName: 'react-aria-TextField'
93
95
  });
94
96
 
95
- let DOMProps = filterDOMProps(props);
97
+ let DOMProps = filterDOMProps(props, {global: true});
96
98
  delete DOMProps.id;
97
99
 
98
100
  return (
@@ -110,6 +112,7 @@ export const TextField = /*#__PURE__*/ createHideableComponent(function TextFiel
110
112
  [LabelContext, {...labelProps, ref: labelRef}],
111
113
  [InputContext, {...mergeProps(inputProps, inputContextProps), ref: inputOrTextAreaRef}],
112
114
  [TextAreaContext, {...inputProps, ref: inputOrTextAreaRef}],
115
+ [GroupContext, {role: 'presentation', isInvalid: validation.isInvalid, isDisabled: props.isDisabled || false}],
113
116
  [TextContext, {
114
117
  slots: {
115
118
  description: descriptionProps,