react-aria-components 1.8.0 → 1.10.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 (120) hide show
  1. package/dist/Autocomplete.main.js.map +1 -1
  2. package/dist/Autocomplete.module.js.map +1 -1
  3. package/dist/Checkbox.main.js +4 -1
  4. package/dist/Checkbox.main.js.map +1 -1
  5. package/dist/Checkbox.mjs +5 -2
  6. package/dist/Checkbox.module.js +5 -2
  7. package/dist/Checkbox.module.js.map +1 -1
  8. package/dist/Collection.main.js +31 -7
  9. package/dist/Collection.main.js.map +1 -1
  10. package/dist/Collection.mjs +32 -9
  11. package/dist/Collection.module.js +32 -9
  12. package/dist/Collection.module.js.map +1 -1
  13. package/dist/ColorPicker.main.js.map +1 -1
  14. package/dist/ColorPicker.module.js.map +1 -1
  15. package/dist/ComboBox.main.js +10 -1
  16. package/dist/ComboBox.main.js.map +1 -1
  17. package/dist/ComboBox.mjs +10 -1
  18. package/dist/ComboBox.module.js +10 -1
  19. package/dist/ComboBox.module.js.map +1 -1
  20. package/dist/DatePicker.main.js +11 -2
  21. package/dist/DatePicker.main.js.map +1 -1
  22. package/dist/DatePicker.mjs +11 -2
  23. package/dist/DatePicker.module.js +11 -2
  24. package/dist/DatePicker.module.js.map +1 -1
  25. package/dist/Dialog.main.js +15 -1
  26. package/dist/Dialog.main.js.map +1 -1
  27. package/dist/Dialog.mjs +17 -3
  28. package/dist/Dialog.module.js +17 -3
  29. package/dist/Dialog.module.js.map +1 -1
  30. package/dist/DragAndDrop.main.js.map +1 -1
  31. package/dist/DragAndDrop.module.js.map +1 -1
  32. package/dist/GridList.main.js +59 -4
  33. package/dist/GridList.main.js.map +1 -1
  34. package/dist/GridList.mjs +60 -6
  35. package/dist/GridList.module.js +60 -6
  36. package/dist/GridList.module.js.map +1 -1
  37. package/dist/ListBox.main.js +61 -3
  38. package/dist/ListBox.main.js.map +1 -1
  39. package/dist/ListBox.mjs +62 -5
  40. package/dist/ListBox.module.js +62 -5
  41. package/dist/ListBox.module.js.map +1 -1
  42. package/dist/Menu.main.js.map +1 -1
  43. package/dist/Menu.module.js.map +1 -1
  44. package/dist/Popover.main.js +12 -2
  45. package/dist/Popover.main.js.map +1 -1
  46. package/dist/Popover.mjs +13 -3
  47. package/dist/Popover.module.js +13 -3
  48. package/dist/Popover.module.js.map +1 -1
  49. package/dist/RadioGroup.main.js +4 -1
  50. package/dist/RadioGroup.main.js.map +1 -1
  51. package/dist/RadioGroup.mjs +5 -2
  52. package/dist/RadioGroup.module.js +5 -2
  53. package/dist/RadioGroup.module.js.map +1 -1
  54. package/dist/Select.main.js +10 -2
  55. package/dist/Select.main.js.map +1 -1
  56. package/dist/Select.mjs +10 -2
  57. package/dist/Select.module.js +10 -2
  58. package/dist/Select.module.js.map +1 -1
  59. package/dist/Table.main.js +42 -10
  60. package/dist/Table.main.js.map +1 -1
  61. package/dist/Table.mjs +43 -11
  62. package/dist/Table.module.js +43 -11
  63. package/dist/Table.module.js.map +1 -1
  64. package/dist/TagGroup.main.js +1 -1
  65. package/dist/TagGroup.main.js.map +1 -1
  66. package/dist/TagGroup.mjs +1 -1
  67. package/dist/TagGroup.module.js +1 -1
  68. package/dist/TagGroup.module.js.map +1 -1
  69. package/dist/Tooltip.main.js.map +1 -1
  70. package/dist/Tooltip.module.js.map +1 -1
  71. package/dist/Tree.main.js +296 -18
  72. package/dist/Tree.main.js.map +1 -1
  73. package/dist/Tree.mjs +299 -21
  74. package/dist/Tree.module.js +299 -21
  75. package/dist/Tree.module.js.map +1 -1
  76. package/dist/TreeDropTargetDelegate.main.js +213 -0
  77. package/dist/TreeDropTargetDelegate.main.js.map +1 -0
  78. package/dist/TreeDropTargetDelegate.mjs +208 -0
  79. package/dist/TreeDropTargetDelegate.module.js +208 -0
  80. package/dist/TreeDropTargetDelegate.module.js.map +1 -0
  81. package/dist/Virtualizer.main.js +8 -10
  82. package/dist/Virtualizer.main.js.map +1 -1
  83. package/dist/Virtualizer.mjs +9 -11
  84. package/dist/Virtualizer.module.js +9 -11
  85. package/dist/Virtualizer.module.js.map +1 -1
  86. package/dist/import.mjs +5 -5
  87. package/dist/main.js +4 -1
  88. package/dist/main.js.map +1 -1
  89. package/dist/module.js +5 -5
  90. package/dist/module.js.map +1 -1
  91. package/dist/types.d.ts +115 -50
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/useDragAndDrop.main.js +2 -2
  94. package/dist/useDragAndDrop.main.js.map +1 -1
  95. package/dist/useDragAndDrop.mjs +2 -2
  96. package/dist/useDragAndDrop.module.js +2 -2
  97. package/dist/useDragAndDrop.module.js.map +1 -1
  98. package/package.json +32 -28
  99. package/src/Autocomplete.tsx +2 -2
  100. package/src/Checkbox.tsx +2 -2
  101. package/src/Collection.tsx +39 -5
  102. package/src/ColorPicker.tsx +2 -2
  103. package/src/ComboBox.tsx +5 -1
  104. package/src/DatePicker.tsx +7 -2
  105. package/src/Dialog.tsx +18 -4
  106. package/src/DragAndDrop.tsx +1 -1
  107. package/src/GridList.tsx +69 -7
  108. package/src/ListBox.tsx +70 -6
  109. package/src/Menu.tsx +2 -1
  110. package/src/Popover.tsx +21 -5
  111. package/src/RadioGroup.tsx +2 -2
  112. package/src/Select.tsx +13 -3
  113. package/src/Table.tsx +44 -16
  114. package/src/TagGroup.tsx +1 -1
  115. package/src/Tooltip.tsx +2 -2
  116. package/src/Tree.tsx +364 -38
  117. package/src/TreeDropTargetDelegate.ts +304 -0
  118. package/src/Virtualizer.tsx +9 -14
  119. package/src/index.ts +8 -7
  120. package/src/useDragAndDrop.tsx +2 -1
package/src/Table.tsx CHANGED
@@ -10,7 +10,7 @@ import {DisabledBehavior, DraggableCollectionState, DroppableCollectionState, Mu
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, isScrollable, mergeRefs, useLayoutEffect, useObjectRef, useResizeObserver} from '@react-aria/utils';
13
+ import {filterDOMProps, inertValue, isScrollable, LoadMoreSentinelProps, mergeRefs, UNSTABLE_useLoadMoreSentinel, useLayoutEffect, 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';
@@ -931,9 +931,10 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
931
931
  let isDroppable = !!dragAndDropHooks?.useDroppableCollectionState && !dropState?.isDisabled;
932
932
  let isRootDropTarget = isDroppable && !!dropState && (dropState.isDropTarget({type: 'root'}) ?? false);
933
933
 
934
+ let isEmpty = collection.size === 0 || (collection.rows.length === 1 && collection.rows[0].type === 'loader');
934
935
  let renderValues = {
935
936
  isDropTarget: isRootDropTarget,
936
- isEmpty: collection.size === 0
937
+ isEmpty
937
938
  };
938
939
  let renderProps = useRenderProps({
939
940
  ...props,
@@ -947,7 +948,8 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
947
948
  let TR = useElementType('tr');
948
949
  let TD = useElementType('td');
949
950
  let numColumns = collection.columnCount;
950
- if (collection.size === 0 && props.renderEmptyState && state) {
951
+
952
+ if (isEmpty && props.renderEmptyState && state) {
951
953
  let rowProps = {};
952
954
  let rowHeaderProps = {};
953
955
  let style = {};
@@ -978,7 +980,7 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
978
980
  {...mergeProps(filterDOMProps(props as any), rowGroupProps)}
979
981
  {...renderProps}
980
982
  ref={ref}
981
- data-empty={collection.size === 0 || undefined}>
983
+ data-empty={isEmpty || undefined}>
982
984
  {isDroppable && <RootDropIndicator />}
983
985
  <CollectionBranch
984
986
  collection={collection}
@@ -1346,17 +1348,34 @@ function RootDropIndicator() {
1346
1348
  );
1347
1349
  }
1348
1350
 
1349
- export interface TableLoadingIndicatorProps extends StyleProps {
1350
- children?: ReactNode
1351
+ export interface TableLoadingSentinelProps extends Omit<LoadMoreSentinelProps, 'collection'>, StyleProps {
1352
+ /**
1353
+ * The load more spinner to render when loading additional items.
1354
+ */
1355
+ children?: ReactNode,
1356
+ /**
1357
+ * Whether or not the loading spinner should be rendered or not.
1358
+ */
1359
+ isLoading?: boolean
1351
1360
  }
1352
1361
 
1353
- export const UNSTABLE_TableLoadingIndicator = createLeafComponent('loader', function TableLoadingIndicator<T extends object>(props: TableLoadingIndicatorProps, ref: ForwardedRef<HTMLTableRowElement>, item: Node<T>) {
1362
+ export const UNSTABLE_TableLoadingSentinel = createLeafComponent('loader', function TableLoadingIndicator<T extends object>(props: TableLoadingSentinelProps, ref: ForwardedRef<HTMLTableRowElement>, item: Node<T>) {
1354
1363
  let state = useContext(TableStateContext)!;
1355
1364
  let {isVirtualized} = useContext(CollectionRendererContext);
1365
+ let {isLoading, onLoadMore, scrollOffset, ...otherProps} = props;
1356
1366
  let numColumns = state.collection.columns.length;
1357
1367
 
1368
+ let sentinelRef = useRef(null);
1369
+ let memoedLoadMoreProps = useMemo(() => ({
1370
+ onLoadMore,
1371
+ collection: state?.collection,
1372
+ sentinelRef,
1373
+ scrollOffset
1374
+ }), [onLoadMore, scrollOffset, state?.collection]);
1375
+ UNSTABLE_useLoadMoreSentinel(memoedLoadMoreProps, sentinelRef);
1376
+
1358
1377
  let renderProps = useRenderProps({
1359
- ...props,
1378
+ ...otherProps,
1360
1379
  id: undefined,
1361
1380
  children: item.rendered,
1362
1381
  defaultClassName: 'react-aria-TableLoadingIndicator',
@@ -1369,7 +1388,7 @@ export const UNSTABLE_TableLoadingIndicator = createLeafComponent('loader', func
1369
1388
  let style = {};
1370
1389
 
1371
1390
  if (isVirtualized) {
1372
- rowProps['aria-rowindex'] = state.collection.headerRows.length + state.collection.size ;
1391
+ rowProps['aria-rowindex'] = item.index + 1 + state.collection.headerRows.length;
1373
1392
  rowHeaderProps['aria-colspan'] = numColumns;
1374
1393
  style = {display: 'contents'};
1375
1394
  } else {
@@ -1378,15 +1397,24 @@ export const UNSTABLE_TableLoadingIndicator = createLeafComponent('loader', func
1378
1397
 
1379
1398
  return (
1380
1399
  <>
1381
- <TR
1382
- role="row"
1383
- ref={ref}
1384
- {...mergeProps(filterDOMProps(props as any), rowProps)}
1385
- {...renderProps}>
1386
- <TD role="rowheader" {...rowHeaderProps} style={style}>
1387
- {renderProps.children}
1400
+ {/* Alway render the sentinel. For now onus is on the user for styling when using flex + gap (this would introduce a gap even though it doesn't take room) */}
1401
+ {/* @ts-ignore - compatibility with React < 19 */}
1402
+ <TR style={{height: 0}} inert={inertValue(true)}>
1403
+ <TD style={{padding: 0, border: 0}}>
1404
+ <div data-testid="loadMoreSentinel" ref={sentinelRef} style={{position: 'relative', height: 1, width: 1}} />
1388
1405
  </TD>
1389
1406
  </TR>
1407
+ {isLoading && renderProps.children && (
1408
+ <TR
1409
+ {...mergeProps(filterDOMProps(props as any), rowProps)}
1410
+ {...renderProps}
1411
+ role="row"
1412
+ ref={ref}>
1413
+ <TD role="rowheader" {...rowHeaderProps} style={style}>
1414
+ {renderProps.children}
1415
+ </TD>
1416
+ </TR>
1417
+ )}
1390
1418
  </>
1391
1419
  );
1392
1420
  });
package/src/TagGroup.tsx CHANGED
@@ -202,7 +202,7 @@ export interface TagProps extends RenderProps<TagRenderProps>, LinkDOMProps, Hov
202
202
  export const Tag = /*#__PURE__*/ createLeafComponent('item', (props: TagProps, forwardedRef: ForwardedRef<HTMLDivElement>, item: Node<unknown>) => {
203
203
  let state = useContext(ListStateContext)!;
204
204
  let ref = useObjectRef<HTMLDivElement>(forwardedRef);
205
- let {focusProps, isFocusVisible} = useFocusRing({within: true});
205
+ let {focusProps, isFocusVisible} = useFocusRing({within: false});
206
206
  let {rowProps, gridCellProps, removeButtonProps, ...states} = useTag({item}, state, ref);
207
207
 
208
208
  let {hoverProps, isHovered} = useHover({
package/src/Tooltip.tsx CHANGED
@@ -16,7 +16,7 @@ import {ContextValue, Provider, RenderProps, useContextProps, useRenderProps} fr
16
16
  import {FocusableProvider} from '@react-aria/focus';
17
17
  import {OverlayArrowContext} from './OverlayArrow';
18
18
  import {OverlayTriggerProps, TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately';
19
- import React, {createContext, ForwardedRef, forwardRef, ReactNode, useContext, useRef, useState} from 'react';
19
+ import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useRef, useState} from 'react';
20
20
  import {useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils';
21
21
 
22
22
  export interface TooltipTriggerComponentProps extends TooltipTriggerProps {
@@ -81,7 +81,7 @@ export const TooltipContext = createContext<ContextValue<TooltipProps, HTMLDivEl
81
81
  * the Tooltip when the user hovers over or focuses the trigger, and positioning the Tooltip
82
82
  * relative to the trigger.
83
83
  */
84
- export function TooltipTrigger(props: TooltipTriggerComponentProps): ReactNode {
84
+ export function TooltipTrigger(props: TooltipTriggerComponentProps): JSX.Element {
85
85
  let state = useTooltipTriggerState(props);
86
86
  let ref = useRef<FocusableElement>(null);
87
87
  let {triggerProps, tooltipProps} = useTooltipTrigger(props, state, ref);