react-aria-components 1.10.1 → 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.
- package/dist/Breadcrumbs.main.js +9 -2
- package/dist/Breadcrumbs.main.js.map +1 -1
- package/dist/Breadcrumbs.mjs +10 -3
- package/dist/Breadcrumbs.module.js +10 -3
- package/dist/Breadcrumbs.module.js.map +1 -1
- package/dist/Button.main.js +7 -17
- package/dist/Button.main.js.map +1 -1
- package/dist/Button.mjs +7 -17
- package/dist/Button.module.js +7 -17
- package/dist/Button.module.js.map +1 -1
- package/dist/Calendar.main.js +36 -14
- package/dist/Calendar.main.js.map +1 -1
- package/dist/Calendar.mjs +38 -16
- package/dist/Calendar.module.js +38 -16
- package/dist/Calendar.module.js.map +1 -1
- package/dist/Checkbox.main.js +8 -3
- package/dist/Checkbox.main.js.map +1 -1
- package/dist/Checkbox.mjs +10 -5
- package/dist/Checkbox.module.js +10 -5
- package/dist/Checkbox.module.js.map +1 -1
- package/dist/Collection.main.js.map +1 -1
- package/dist/Collection.module.js.map +1 -1
- package/dist/ColorArea.main.js +4 -4
- package/dist/ColorArea.main.js.map +1 -1
- package/dist/ColorArea.mjs +5 -5
- package/dist/ColorArea.module.js +5 -5
- package/dist/ColorArea.module.js.map +1 -1
- package/dist/ColorField.main.js +14 -1
- package/dist/ColorField.main.js.map +1 -1
- package/dist/ColorField.mjs +14 -1
- package/dist/ColorField.module.js +14 -1
- package/dist/ColorField.module.js.map +1 -1
- package/dist/ColorSlider.main.js +3 -1
- package/dist/ColorSlider.main.js.map +1 -1
- package/dist/ColorSlider.mjs +3 -1
- package/dist/ColorSlider.module.js +3 -1
- package/dist/ColorSlider.module.js.map +1 -1
- package/dist/ColorSwatch.main.js +6 -2
- package/dist/ColorSwatch.main.js.map +1 -1
- package/dist/ColorSwatch.mjs +6 -2
- package/dist/ColorSwatch.module.js +6 -2
- package/dist/ColorSwatch.module.js.map +1 -1
- package/dist/ColorSwatchPicker.main.js.map +1 -1
- package/dist/ColorSwatchPicker.module.js.map +1 -1
- package/dist/ColorThumb.main.js +3 -1
- package/dist/ColorThumb.main.js.map +1 -1
- package/dist/ColorThumb.mjs +3 -1
- package/dist/ColorThumb.module.js +3 -1
- package/dist/ColorThumb.module.js.map +1 -1
- package/dist/ColorWheel.main.js +3 -1
- package/dist/ColorWheel.main.js.map +1 -1
- package/dist/ColorWheel.mjs +3 -1
- package/dist/ColorWheel.module.js +3 -1
- package/dist/ColorWheel.module.js.map +1 -1
- package/dist/ComboBox.main.js +4 -1
- package/dist/ComboBox.main.js.map +1 -1
- package/dist/ComboBox.mjs +4 -1
- package/dist/ComboBox.module.js +4 -1
- package/dist/ComboBox.module.js.map +1 -1
- package/dist/DateField.main.js +16 -3
- package/dist/DateField.main.js.map +1 -1
- package/dist/DateField.mjs +16 -3
- package/dist/DateField.module.js +16 -3
- package/dist/DateField.module.js.map +1 -1
- package/dist/DatePicker.main.js +15 -8
- package/dist/DatePicker.main.js.map +1 -1
- package/dist/DatePicker.mjs +16 -9
- package/dist/DatePicker.module.js +16 -9
- package/dist/DatePicker.module.js.map +1 -1
- package/dist/Dialog.main.js +4 -3
- package/dist/Dialog.main.js.map +1 -1
- package/dist/Dialog.mjs +5 -4
- package/dist/Dialog.module.js +5 -4
- package/dist/Dialog.module.js.map +1 -1
- package/dist/Disclosure.main.js +12 -10
- package/dist/Disclosure.main.js.map +1 -1
- package/dist/Disclosure.mjs +13 -11
- package/dist/Disclosure.module.js +13 -11
- package/dist/Disclosure.module.js.map +1 -1
- package/dist/DragAndDrop.main.js +31 -3
- package/dist/DragAndDrop.main.js.map +1 -1
- package/dist/DragAndDrop.mjs +31 -3
- package/dist/DragAndDrop.module.js +31 -3
- package/dist/DragAndDrop.module.js.map +1 -1
- package/dist/DropZone.main.js +4 -3
- package/dist/DropZone.main.js.map +1 -1
- package/dist/DropZone.mjs +4 -3
- package/dist/DropZone.module.js +4 -3
- package/dist/DropZone.module.js.map +1 -1
- package/dist/FieldError.main.js +3 -1
- package/dist/FieldError.main.js.map +1 -1
- package/dist/FieldError.mjs +3 -1
- package/dist/FieldError.module.js +3 -1
- package/dist/FieldError.module.js.map +1 -1
- package/dist/FileTrigger.main.js +3 -1
- package/dist/FileTrigger.main.js.map +1 -1
- package/dist/FileTrigger.mjs +3 -1
- package/dist/FileTrigger.module.js +3 -1
- package/dist/FileTrigger.module.js.map +1 -1
- package/dist/Form.main.js.map +1 -1
- package/dist/Form.module.js.map +1 -1
- package/dist/GridList.main.js +20 -13
- package/dist/GridList.main.js.map +1 -1
- package/dist/GridList.mjs +21 -14
- package/dist/GridList.module.js +21 -14
- package/dist/GridList.module.js.map +1 -1
- package/dist/HiddenDateInput.main.js +118 -0
- package/dist/HiddenDateInput.main.js.map +1 -0
- package/dist/HiddenDateInput.mjs +109 -0
- package/dist/HiddenDateInput.module.js +109 -0
- package/dist/HiddenDateInput.module.js.map +1 -0
- package/dist/Link.main.js +7 -1
- package/dist/Link.main.js.map +1 -1
- package/dist/Link.mjs +7 -1
- package/dist/Link.module.js +7 -1
- package/dist/Link.module.js.map +1 -1
- package/dist/ListBox.main.js +22 -19
- package/dist/ListBox.main.js.map +1 -1
- package/dist/ListBox.mjs +23 -20
- package/dist/ListBox.module.js +23 -20
- package/dist/ListBox.module.js.map +1 -1
- package/dist/Menu.main.js +15 -8
- package/dist/Menu.main.js.map +1 -1
- package/dist/Menu.mjs +16 -9
- package/dist/Menu.module.js +16 -9
- package/dist/Menu.module.js.map +1 -1
- package/dist/Meter.main.js +6 -2
- package/dist/Meter.main.js.map +1 -1
- package/dist/Meter.mjs +6 -2
- package/dist/Meter.module.js +6 -2
- package/dist/Meter.module.js.map +1 -1
- package/dist/Modal.main.js +31 -6
- package/dist/Modal.main.js.map +1 -1
- package/dist/Modal.mjs +31 -6
- package/dist/Modal.module.js +31 -6
- package/dist/Modal.module.js.map +1 -1
- package/dist/NumberField.main.js +4 -1
- package/dist/NumberField.main.js.map +1 -1
- package/dist/NumberField.mjs +4 -1
- package/dist/NumberField.module.js +4 -1
- package/dist/NumberField.module.js.map +1 -1
- package/dist/Popover.main.js +3 -1
- package/dist/Popover.main.js.map +1 -1
- package/dist/Popover.mjs +3 -1
- package/dist/Popover.module.js +3 -1
- package/dist/Popover.module.js.map +1 -1
- package/dist/ProgressBar.main.js +6 -2
- package/dist/ProgressBar.main.js.map +1 -1
- package/dist/ProgressBar.mjs +6 -2
- package/dist/ProgressBar.module.js +6 -2
- package/dist/ProgressBar.module.js.map +1 -1
- package/dist/RadioGroup.main.js +8 -3
- package/dist/RadioGroup.main.js.map +1 -1
- package/dist/RadioGroup.mjs +9 -4
- package/dist/RadioGroup.module.js +9 -4
- package/dist/RadioGroup.module.js.map +1 -1
- package/dist/SearchField.main.js +3 -1
- package/dist/SearchField.main.js.map +1 -1
- package/dist/SearchField.mjs +3 -1
- package/dist/SearchField.module.js +3 -1
- package/dist/SearchField.module.js.map +1 -1
- package/dist/Select.main.js +12 -14
- package/dist/Select.main.js.map +1 -1
- package/dist/Select.mjs +13 -15
- package/dist/Select.module.js +13 -15
- package/dist/Select.module.js.map +1 -1
- package/dist/Separator.main.js +4 -2
- package/dist/Separator.main.js.map +1 -1
- package/dist/Separator.mjs +5 -3
- package/dist/Separator.module.js +5 -3
- package/dist/Separator.module.js.map +1 -1
- package/dist/Slider.main.js +7 -5
- package/dist/Slider.main.js.map +1 -1
- package/dist/Slider.mjs +8 -6
- package/dist/Slider.module.js +8 -6
- package/dist/Slider.module.js.map +1 -1
- package/dist/Switch.main.js +4 -1
- package/dist/Switch.main.js.map +1 -1
- package/dist/Switch.mjs +4 -1
- package/dist/Switch.module.js +4 -1
- package/dist/Switch.module.js.map +1 -1
- package/dist/Table.main.js +47 -26
- package/dist/Table.main.js.map +1 -1
- package/dist/Table.mjs +48 -27
- package/dist/Table.module.js +48 -27
- package/dist/Table.module.js.map +1 -1
- package/dist/Tabs.main.js +20 -10
- package/dist/Tabs.main.js.map +1 -1
- package/dist/Tabs.mjs +21 -11
- package/dist/Tabs.module.js +21 -11
- package/dist/Tabs.module.js.map +1 -1
- package/dist/TagGroup.main.js +14 -8
- package/dist/TagGroup.main.js.map +1 -1
- package/dist/TagGroup.mjs +14 -8
- package/dist/TagGroup.module.js +14 -8
- package/dist/TagGroup.module.js.map +1 -1
- package/dist/TextField.main.js +13 -1
- package/dist/TextField.main.js.map +1 -1
- package/dist/TextField.mjs +13 -1
- package/dist/TextField.module.js +13 -1
- package/dist/TextField.module.js.map +1 -1
- package/dist/Toast.main.js +9 -5
- package/dist/Toast.main.js.map +1 -1
- package/dist/Toast.mjs +9 -5
- package/dist/Toast.module.js +9 -5
- package/dist/Toast.module.js.map +1 -1
- package/dist/ToggleButton.main.js +8 -2
- package/dist/ToggleButton.main.js.map +1 -1
- package/dist/ToggleButton.mjs +8 -2
- package/dist/ToggleButton.module.js +8 -2
- package/dist/ToggleButton.module.js.map +1 -1
- package/dist/ToggleButtonGroup.main.js +6 -2
- package/dist/ToggleButtonGroup.main.js.map +1 -1
- package/dist/ToggleButtonGroup.mjs +6 -2
- package/dist/ToggleButtonGroup.module.js +6 -2
- package/dist/ToggleButtonGroup.module.js.map +1 -1
- package/dist/Toolbar.main.js +4 -3
- package/dist/Toolbar.main.js.map +1 -1
- package/dist/Toolbar.mjs +4 -3
- package/dist/Toolbar.module.js +4 -3
- package/dist/Toolbar.module.js.map +1 -1
- package/dist/Tooltip.main.js +5 -3
- package/dist/Tooltip.main.js.map +1 -1
- package/dist/Tooltip.mjs +5 -3
- package/dist/Tooltip.module.js +5 -3
- package/dist/Tooltip.module.js.map +1 -1
- package/dist/Tree.main.js +73 -26
- package/dist/Tree.main.js.map +1 -1
- package/dist/Tree.mjs +74 -27
- package/dist/Tree.module.js +74 -27
- package/dist/Tree.module.js.map +1 -1
- package/dist/TreeDropTargetDelegate.main.js +8 -5
- package/dist/TreeDropTargetDelegate.main.js.map +1 -1
- package/dist/TreeDropTargetDelegate.mjs +8 -5
- package/dist/TreeDropTargetDelegate.module.js +8 -5
- package/dist/TreeDropTargetDelegate.module.js.map +1 -1
- package/dist/import.mjs +5 -5
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/module.js +5 -5
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +212 -203
- package/dist/types.d.ts.map +1 -1
- package/dist/useDragAndDrop.main.js.map +1 -1
- package/dist/useDragAndDrop.module.js.map +1 -1
- package/dist/utils.main.js.map +1 -1
- package/dist/utils.module.js.map +1 -1
- package/i18n/de-DE.js +1 -1
- package/i18n/de-DE.mjs +1 -1
- package/package.json +25 -25
- package/src/Breadcrumbs.tsx +10 -6
- package/src/Button.tsx +8 -30
- package/src/Calendar.tsx +41 -24
- package/src/Checkbox.tsx +8 -6
- package/src/Collection.tsx +2 -2
- package/src/ColorArea.tsx +5 -6
- package/src/ColorField.tsx +6 -4
- package/src/ColorSlider.tsx +3 -2
- package/src/ColorSwatch.tsx +6 -3
- package/src/ColorSwatchPicker.tsx +3 -3
- package/src/ColorThumb.tsx +3 -3
- package/src/ColorWheel.tsx +6 -5
- package/src/ComboBox.tsx +4 -4
- package/src/DateField.tsx +15 -10
- package/src/DatePicker.tsx +14 -12
- package/src/Dialog.tsx +6 -6
- package/src/Disclosure.tsx +10 -14
- package/src/DragAndDrop.tsx +31 -1
- package/src/DropZone.tsx +4 -5
- package/src/FieldError.tsx +3 -3
- package/src/FileTrigger.tsx +4 -3
- package/src/Form.tsx +2 -1
- package/src/GridList.tsx +25 -18
- package/src/HiddenDateInput.tsx +142 -0
- package/src/Link.tsx +7 -3
- package/src/ListBox.tsx +30 -26
- package/src/Menu.tsx +15 -12
- package/src/Meter.tsx +6 -3
- package/src/Modal.tsx +16 -5
- package/src/NumberField.tsx +4 -4
- package/src/Popover.tsx +3 -3
- package/src/ProgressBar.tsx +6 -2
- package/src/RadioGroup.tsx +8 -6
- package/src/SearchField.tsx +3 -2
- package/src/Select.tsx +13 -16
- package/src/Separator.tsx +6 -4
- package/src/Slider.tsx +9 -11
- package/src/Switch.tsx +4 -3
- package/src/Table.tsx +58 -56
- package/src/Tabs.tsx +18 -15
- package/src/TagGroup.tsx +13 -12
- package/src/TextField.tsx +5 -2
- package/src/Toast.tsx +10 -8
- package/src/ToggleButton.tsx +8 -4
- package/src/ToggleButtonGroup.tsx +6 -4
- package/src/Toolbar.tsx +4 -5
- package/src/Tooltip.tsx +6 -5
- package/src/Tree.tsx +90 -42
- package/src/TreeDropTargetDelegate.ts +5 -1
- package/src/index.ts +8 -8
- package/src/useDragAndDrop.tsx +2 -2
- package/src/utils.tsx +9 -9
package/src/Toast.tsx
CHANGED
|
@@ -14,12 +14,12 @@ import {AriaToastProps, AriaToastRegionProps, mergeProps, useFocusRing, useHover
|
|
|
14
14
|
import {ButtonContext} from './Button';
|
|
15
15
|
import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
|
|
16
16
|
import {createPortal} from 'react-dom';
|
|
17
|
-
import {
|
|
17
|
+
import {filterDOMProps, useObjectRef} from '@react-aria/utils';
|
|
18
|
+
import {forwardRefType, GlobalDOMAttributes} from '@react-types/shared';
|
|
18
19
|
import {QueuedToast, ToastQueue, ToastState, useToastQueue} from 'react-stately';
|
|
19
20
|
import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes, JSX, ReactElement, ReactNode, useContext} from 'react';
|
|
20
21
|
import {TextContext} from './Text';
|
|
21
22
|
import {useIsSSR} from '@react-aria/ssr';
|
|
22
|
-
import {useObjectRef} from '@react-aria/utils';
|
|
23
23
|
import {useUNSAFE_PortalContext} from '@react-aria/overlays';
|
|
24
24
|
|
|
25
25
|
export const ToastStateContext = createContext<ToastState<any> | null>(null);
|
|
@@ -44,7 +44,7 @@ export interface ToastRegionRenderProps<T> {
|
|
|
44
44
|
isFocusVisible: boolean
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
export interface ToastRegionProps<T> extends AriaToastRegionProps, StyleRenderProps<ToastRegionRenderProps<T
|
|
47
|
+
export interface ToastRegionProps<T> extends AriaToastRegionProps, StyleRenderProps<ToastRegionRenderProps<T>>, GlobalDOMAttributes<HTMLDivElement> {
|
|
48
48
|
/** The queue of toasts to display. */
|
|
49
49
|
queue: ToastQueue<T>,
|
|
50
50
|
/** A function to render each toast, or children containing a `<ToastList>`. */
|
|
@@ -84,11 +84,12 @@ export const ToastRegion = /*#__PURE__*/ (forwardRef as forwardRefType)(function
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
88
|
+
|
|
87
89
|
let region = (
|
|
88
90
|
<ToastStateContext.Provider value={state}>
|
|
89
91
|
<div
|
|
90
|
-
{...renderProps}
|
|
91
|
-
{...mergeProps(regionProps, focusProps, hoverProps)}
|
|
92
|
+
{...mergeProps(DOMProps, renderProps, regionProps, focusProps, hoverProps)}
|
|
92
93
|
dir={direction}
|
|
93
94
|
ref={objectRef}
|
|
94
95
|
data-hovered={isHovered || undefined}
|
|
@@ -152,7 +153,7 @@ export interface ToastRenderProps<T> {
|
|
|
152
153
|
isFocusVisible: boolean
|
|
153
154
|
}
|
|
154
155
|
|
|
155
|
-
export interface ToastProps<T> extends AriaToastProps<T>, RenderProps<ToastRenderProps<T
|
|
156
|
+
export interface ToastProps<T> extends AriaToastProps<T>, RenderProps<ToastRenderProps<T>>, GlobalDOMAttributes<HTMLDivElement> {}
|
|
156
157
|
|
|
157
158
|
/**
|
|
158
159
|
* A Toast displays a brief, temporary notification of actions, errors, or other events in an application.
|
|
@@ -177,10 +178,11 @@ export const Toast = /*#__PURE__*/ (forwardRef as forwardRefType)(function Toast
|
|
|
177
178
|
}
|
|
178
179
|
});
|
|
179
180
|
|
|
181
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
182
|
+
|
|
180
183
|
return (
|
|
181
184
|
<div
|
|
182
|
-
{...renderProps}
|
|
183
|
-
{...mergeProps(toastProps, focusProps)}
|
|
185
|
+
{...mergeProps(DOMProps, renderProps, toastProps, focusProps)}
|
|
184
186
|
ref={objectRef}
|
|
185
187
|
data-focused={isFocused || undefined}
|
|
186
188
|
data-focus-visible={isFocusVisible || undefined}>
|
package/src/ToggleButton.tsx
CHANGED
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
import {AriaToggleButtonProps, HoverEvents, mergeProps, useFocusRing, useHover, useToggleButton, useToggleButtonGroupItem} from 'react-aria';
|
|
14
14
|
import {ButtonRenderProps} from './Button';
|
|
15
15
|
import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
|
|
16
|
-
import {
|
|
16
|
+
import {filterDOMProps} from '@react-aria/utils';
|
|
17
|
+
import {forwardRefType, GlobalDOMAttributes, Key} from '@react-types/shared';
|
|
17
18
|
import React, {createContext, ForwardedRef, forwardRef, useContext} from 'react';
|
|
18
19
|
import {ToggleGroupStateContext} from './ToggleButtonGroup';
|
|
19
20
|
import {ToggleState, useToggleState} from 'react-stately';
|
|
@@ -30,7 +31,7 @@ export interface ToggleButtonRenderProps extends Omit<ButtonRenderProps, 'isPend
|
|
|
30
31
|
state: ToggleState
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps> {
|
|
34
|
+
export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
|
|
34
35
|
/** When used in a ToggleButtonGroup, an identifier for the item in `selectedKeys`. When used standalone, a DOM id. */
|
|
35
36
|
id?: Key
|
|
36
37
|
}
|
|
@@ -65,10 +66,13 @@ export const ToggleButton = /*#__PURE__*/ (forwardRef as forwardRefType)(functio
|
|
|
65
66
|
defaultClassName: 'react-aria-ToggleButton'
|
|
66
67
|
});
|
|
67
68
|
|
|
69
|
+
let DOMProps = filterDOMProps(props as any, {global: true});
|
|
70
|
+
delete DOMProps.id;
|
|
71
|
+
delete DOMProps.onClick;
|
|
72
|
+
|
|
68
73
|
return (
|
|
69
74
|
<button
|
|
70
|
-
{...mergeProps(buttonProps, focusProps, hoverProps)}
|
|
71
|
-
{...renderProps}
|
|
75
|
+
{...mergeProps(DOMProps, renderProps, buttonProps, focusProps, hoverProps)}
|
|
72
76
|
ref={ref}
|
|
73
77
|
slot={props.slot || undefined}
|
|
74
78
|
data-focused={isFocused || undefined}
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import {AriaToggleButtonGroupProps, useToggleButtonGroup} from 'react-aria';
|
|
13
13
|
import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
|
|
14
|
-
import {
|
|
14
|
+
import {filterDOMProps, mergeProps} from '@react-aria/utils';
|
|
15
|
+
import {forwardRefType, GlobalDOMAttributes} from '@react-types/shared';
|
|
15
16
|
import React, {createContext, ForwardedRef, forwardRef} from 'react';
|
|
16
17
|
import {ToggleGroupState, useToggleGroupState} from 'react-stately';
|
|
17
18
|
|
|
@@ -27,7 +28,7 @@ export interface ToggleButtonGroupRenderProps {
|
|
|
27
28
|
state: ToggleGroupState
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export interface ToggleButtonGroupProps extends AriaToggleButtonGroupProps, RenderProps<ToggleButtonGroupRenderProps>, SlotProps {}
|
|
31
|
+
export interface ToggleButtonGroupProps extends AriaToggleButtonGroupProps, RenderProps<ToggleButtonGroupRenderProps>, SlotProps, GlobalDOMAttributes<HTMLDivElement> {}
|
|
31
32
|
|
|
32
33
|
export const ToggleButtonGroupContext = createContext<ContextValue<ToggleButtonGroupProps, HTMLDivElement>>({});
|
|
33
34
|
export const ToggleGroupStateContext = createContext<ToggleGroupState | null>(null);
|
|
@@ -49,10 +50,11 @@ export const ToggleButtonGroup = /*#__PURE__*/ (forwardRef as forwardRefType)(fu
|
|
|
49
50
|
defaultClassName: 'react-aria-ToggleButtonGroup'
|
|
50
51
|
});
|
|
51
52
|
|
|
53
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
54
|
+
|
|
52
55
|
return (
|
|
53
56
|
<div
|
|
54
|
-
{...groupProps}
|
|
55
|
-
{...renderProps}
|
|
57
|
+
{...mergeProps(DOMProps, renderProps, groupProps)}
|
|
56
58
|
ref={ref}
|
|
57
59
|
slot={props.slot || undefined}
|
|
58
60
|
data-orientation={props.orientation || 'horizontal'}
|
package/src/Toolbar.tsx
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import {AriaToolbarProps, useToolbar} from '@react-aria/toolbar';
|
|
14
14
|
import {ContextValue, RenderProps, SlotProps, useContextProps, useRenderProps} from './utils';
|
|
15
15
|
import {filterDOMProps, mergeProps} from '@react-aria/utils';
|
|
16
|
-
import {forwardRefType, Orientation} from '@react-types/shared';
|
|
16
|
+
import {forwardRefType, GlobalDOMAttributes, Orientation} from '@react-types/shared';
|
|
17
17
|
import React, {createContext, ForwardedRef, forwardRef} from 'react';
|
|
18
18
|
|
|
19
19
|
export interface ToolbarRenderProps {
|
|
@@ -24,7 +24,7 @@ export interface ToolbarRenderProps {
|
|
|
24
24
|
orientation: Orientation
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export interface ToolbarProps extends AriaToolbarProps, SlotProps, RenderProps<ToolbarRenderProps> {
|
|
27
|
+
export interface ToolbarProps extends AriaToolbarProps, SlotProps, RenderProps<ToolbarRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export const ToolbarContext = createContext<ContextValue<ToolbarProps, HTMLDivElement>>({});
|
|
@@ -41,13 +41,12 @@ export const Toolbar = /*#__PURE__*/ (forwardRef as forwardRefType)(function Too
|
|
|
41
41
|
values: {orientation: props.orientation || 'horizontal'},
|
|
42
42
|
defaultClassName: 'react-aria-Toolbar'
|
|
43
43
|
});
|
|
44
|
-
let DOMProps = filterDOMProps(props);
|
|
44
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
45
45
|
delete DOMProps.id;
|
|
46
46
|
|
|
47
47
|
return (
|
|
48
48
|
<div
|
|
49
|
-
{...mergeProps(
|
|
50
|
-
{...renderProps}
|
|
49
|
+
{...mergeProps(DOMProps, renderProps, toolbarProps)}
|
|
51
50
|
ref={ref}
|
|
52
51
|
slot={props.slot || undefined}
|
|
53
52
|
data-orientation={props.orientation || 'horizontal'}>
|
package/src/Tooltip.tsx
CHANGED
|
@@ -10,20 +10,20 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {AriaLabelingProps, FocusableElement, forwardRefType, RefObject} from '@react-types/shared';
|
|
13
|
+
import {AriaLabelingProps, FocusableElement, forwardRefType, GlobalDOMAttributes, RefObject} from '@react-types/shared';
|
|
14
14
|
import {AriaPositionProps, mergeProps, OverlayContainer, Placement, PlacementAxis, PositionProps, useOverlayPosition, useTooltip, useTooltipTrigger} from 'react-aria';
|
|
15
15
|
import {ContextValue, Provider, RenderProps, useContextProps, useRenderProps} from './utils';
|
|
16
|
+
import {filterDOMProps, useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils';
|
|
16
17
|
import {FocusableProvider} from '@react-aria/focus';
|
|
17
18
|
import {OverlayArrowContext} from './OverlayArrow';
|
|
18
19
|
import {OverlayTriggerProps, TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately';
|
|
19
20
|
import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useRef, useState} from 'react';
|
|
20
|
-
import {useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils';
|
|
21
21
|
|
|
22
22
|
export interface TooltipTriggerComponentProps extends TooltipTriggerProps {
|
|
23
23
|
children: ReactNode
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export interface TooltipProps extends PositionProps, Pick<AriaPositionProps, 'arrowBoundaryOffset'>, OverlayTriggerProps, AriaLabelingProps, RenderProps<TooltipRenderProps> {
|
|
26
|
+
export interface TooltipProps extends PositionProps, Pick<AriaPositionProps, 'arrowBoundaryOffset'>, OverlayTriggerProps, AriaLabelingProps, RenderProps<TooltipRenderProps>, GlobalDOMAttributes<HTMLDivElement> {
|
|
27
27
|
/**
|
|
28
28
|
* The ref for the element which the tooltip positions itself with respect to.
|
|
29
29
|
*
|
|
@@ -160,11 +160,12 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref
|
|
|
160
160
|
props = mergeProps(props, overlayProps);
|
|
161
161
|
let {tooltipProps} = useTooltip(props, state);
|
|
162
162
|
|
|
163
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
164
|
+
|
|
163
165
|
return (
|
|
164
166
|
<div
|
|
165
|
-
{...tooltipProps}
|
|
167
|
+
{...mergeProps(DOMProps, renderProps, tooltipProps)}
|
|
166
168
|
ref={props.tooltipRef}
|
|
167
|
-
{...renderProps}
|
|
168
169
|
style={{...overlayProps.style, ...renderProps.style}}
|
|
169
170
|
data-placement={placement ?? undefined}
|
|
170
171
|
data-entering={isEntering || undefined}
|
package/src/Tree.tsx
CHANGED
|
@@ -15,12 +15,12 @@ import {ButtonContext} from './Button';
|
|
|
15
15
|
import {CheckboxContext} from './RSPContexts';
|
|
16
16
|
import {Collection, CollectionBuilder, CollectionNode, createBranchComponent, createLeafComponent, useCachedChildren} from '@react-aria/collections';
|
|
17
17
|
import {CollectionProps, CollectionRendererContext, DefaultCollectionRenderer, ItemRenderProps} from './Collection';
|
|
18
|
-
import {ContextValue, DEFAULT_SLOT, Provider, RenderProps,
|
|
19
|
-
import {DisabledBehavior, DragPreviewRenderer, Expandable, forwardRefType, HoverEvents, Key, LinkDOMProps, MultipleSelection, RefObject, SelectionMode} from '@react-types/shared';
|
|
18
|
+
import {ContextValue, DEFAULT_SLOT, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
|
|
19
|
+
import {DisabledBehavior, DragPreviewRenderer, Expandable, forwardRefType, GlobalDOMAttributes, HoverEvents, Key, LinkDOMProps, MultipleSelection, PressEvents, RefObject, SelectionMode} from '@react-types/shared';
|
|
20
20
|
import {DragAndDropContext, DropIndicatorContext, useDndPersistedKeys, useRenderDropIndicator} from './DragAndDrop';
|
|
21
21
|
import {DragAndDropHooks} from './useDragAndDrop';
|
|
22
22
|
import {DraggableCollectionState, DroppableCollectionState, Collection as ICollection, Node, SelectionBehavior, TreeState, useTreeState} from 'react-stately';
|
|
23
|
-
import {filterDOMProps, useObjectRef} from '@react-aria/utils';
|
|
23
|
+
import {filterDOMProps, inertValue, LoadMoreSentinelProps, useLoadMoreSentinel, useObjectRef} from '@react-aria/utils';
|
|
24
24
|
import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useEffect, useMemo, useRef, useState} from 'react';
|
|
25
25
|
import {TreeDropTargetDelegate} from './TreeDropTargetDelegate';
|
|
26
26
|
import {useControlledState} from '@react-stately/utils';
|
|
@@ -28,13 +28,15 @@ import {useControlledState} from '@react-stately/utils';
|
|
|
28
28
|
class TreeCollection<T> implements ICollection<Node<T>> {
|
|
29
29
|
private flattenedRows: Node<T>[];
|
|
30
30
|
private keyMap: Map<Key, CollectionNode<T>> = new Map();
|
|
31
|
+
private itemCount: number = 0;
|
|
31
32
|
|
|
32
33
|
constructor(opts) {
|
|
33
34
|
let {collection, expandedKeys} = opts;
|
|
34
|
-
let {flattenedRows, keyMap} = flattenTree<T>(collection, {expandedKeys});
|
|
35
|
+
let {flattenedRows, keyMap, itemCount} = flattenTree<T>(collection, {expandedKeys});
|
|
35
36
|
this.flattenedRows = flattenedRows;
|
|
36
37
|
// Use generated keyMap because it contains the modified collection nodes (aka it adjusts the indexes so that they ignore the existence of the Content items)
|
|
37
38
|
this.keyMap = keyMap;
|
|
39
|
+
this.itemCount = itemCount;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
// TODO: should this collection's getters reflect the flattened structure or the original structure
|
|
@@ -44,7 +46,7 @@ class TreeCollection<T> implements ICollection<Node<T>> {
|
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
get size() {
|
|
47
|
-
return this.
|
|
49
|
+
return this.itemCount;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
getKeys() {
|
|
@@ -64,7 +66,7 @@ class TreeCollection<T> implements ICollection<Node<T>> {
|
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
getLastKey() {
|
|
67
|
-
return this.flattenedRows[this.
|
|
69
|
+
return this.flattenedRows[this.flattenedRows.length - 1]?.key;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
getKeyAfter(key: Key) {
|
|
@@ -132,8 +134,11 @@ export interface TreeRenderProps {
|
|
|
132
134
|
|
|
133
135
|
export interface TreeEmptyStateRenderProps extends Omit<TreeRenderProps, 'isEmpty'> {}
|
|
134
136
|
|
|
135
|
-
export interface TreeProps<T> extends Omit<AriaTreeProps<T>, 'children'>, MultipleSelection, CollectionProps<T>, StyleRenderProps<TreeRenderProps>, SlotProps,
|
|
136
|
-
/**
|
|
137
|
+
export interface TreeProps<T> extends Omit<AriaTreeProps<T>, 'children'>, MultipleSelection, CollectionProps<T>, StyleRenderProps<TreeRenderProps>, SlotProps, Expandable, GlobalDOMAttributes<HTMLDivElement> {
|
|
138
|
+
/**
|
|
139
|
+
* How multiple selection should behave in the tree.
|
|
140
|
+
* @default "toggle"
|
|
141
|
+
*/
|
|
137
142
|
selectionBehavior?: SelectionBehavior,
|
|
138
143
|
/** Provides content to display when there are no items in the list. */
|
|
139
144
|
renderEmptyState?: (props: TreeEmptyStateRenderProps) => ReactNode,
|
|
@@ -361,9 +366,7 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
|
|
|
361
366
|
let {isEmpty, ...values} = renderValues;
|
|
362
367
|
let content = props.renderEmptyState({...values});
|
|
363
368
|
let treeGridRowProps = {
|
|
364
|
-
'aria-level': 1
|
|
365
|
-
'aria-posinset': 1,
|
|
366
|
-
'aria-setsize': 1
|
|
369
|
+
'aria-level': 1
|
|
367
370
|
};
|
|
368
371
|
|
|
369
372
|
emptyState = (
|
|
@@ -375,16 +378,15 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
|
|
|
375
378
|
);
|
|
376
379
|
}
|
|
377
380
|
|
|
381
|
+
let DOMProps = filterDOMProps(props, {global: true});
|
|
382
|
+
|
|
378
383
|
return (
|
|
379
384
|
<>
|
|
380
385
|
<FocusScope>
|
|
381
386
|
<div
|
|
382
|
-
{...
|
|
383
|
-
{...renderProps}
|
|
384
|
-
{...mergeProps(gridProps, focusProps, droppableCollection?.collectionProps)}
|
|
387
|
+
{...mergeProps(DOMProps, renderProps, gridProps, focusProps, droppableCollection?.collectionProps)}
|
|
385
388
|
ref={ref}
|
|
386
389
|
slot={props.slot || undefined}
|
|
387
|
-
onScroll={props.onScroll}
|
|
388
390
|
data-empty={state.collection.size === 0 || undefined}
|
|
389
391
|
data-focused={isFocused || undefined}
|
|
390
392
|
data-drop-target={isRootDropTarget || undefined}
|
|
@@ -461,7 +463,7 @@ export const TreeItemContent = /*#__PURE__*/ createLeafComponent('content', func
|
|
|
461
463
|
|
|
462
464
|
export const TreeItemContentContext = createContext<TreeItemContentRenderProps | null>(null);
|
|
463
465
|
|
|
464
|
-
export interface TreeItemProps<T = object> extends StyleRenderProps<TreeItemRenderProps>, LinkDOMProps, HoverEvents, Pick<AriaTreeItemOptions, 'hasChildItems'> {
|
|
466
|
+
export interface TreeItemProps<T = object> extends StyleRenderProps<TreeItemRenderProps>, LinkDOMProps, HoverEvents, PressEvents, Pick<AriaTreeItemOptions, 'hasChildItems'>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
|
|
465
467
|
/** The unique id of the tree row. */
|
|
466
468
|
id?: Key,
|
|
467
469
|
/** The object value that this tree item represents. When using dynamic collections, this is set automatically. */
|
|
@@ -496,7 +498,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
|
|
|
496
498
|
shouldSelectOnPressUp: !!dragState
|
|
497
499
|
}, state, ref);
|
|
498
500
|
let isExpanded = rowProps['aria-expanded'] === true;
|
|
499
|
-
let hasChildItems = props.hasChildItems || [...state.collection.getChildren!(item.key)]?.length > 1
|
|
501
|
+
let hasChildItems = props.hasChildItems || [...state.collection.getChildren!(item.key)]?.length > 1;
|
|
500
502
|
let level = rowProps['aria-level'] || 1;
|
|
501
503
|
|
|
502
504
|
let {hoverProps, isHovered} = useHover({
|
|
@@ -607,6 +609,9 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
|
|
|
607
609
|
});
|
|
608
610
|
|
|
609
611
|
let activateButtonId = useId();
|
|
612
|
+
let DOMProps = filterDOMProps(props as any, {global: true});
|
|
613
|
+
delete DOMProps.id;
|
|
614
|
+
delete DOMProps.onClick;
|
|
610
615
|
|
|
611
616
|
return (
|
|
612
617
|
<>
|
|
@@ -634,7 +639,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
|
|
|
634
639
|
)}
|
|
635
640
|
<div
|
|
636
641
|
{...mergeProps(
|
|
637
|
-
|
|
642
|
+
DOMProps,
|
|
638
643
|
rowProps,
|
|
639
644
|
focusProps,
|
|
640
645
|
hoverProps,
|
|
@@ -695,7 +700,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent('item', <T extends o
|
|
|
695
700
|
);
|
|
696
701
|
});
|
|
697
702
|
|
|
698
|
-
export interface
|
|
703
|
+
export interface TreeLoadMoreItemRenderProps {
|
|
699
704
|
/**
|
|
700
705
|
* What level the tree item has within the tree.
|
|
701
706
|
* @selector [data-level]
|
|
@@ -703,23 +708,46 @@ export interface UNSTABLE_TreeLoadingIndicatorRenderProps {
|
|
|
703
708
|
level: number
|
|
704
709
|
}
|
|
705
710
|
|
|
706
|
-
export interface
|
|
711
|
+
export interface TreeLoadMoreItemProps extends Omit<LoadMoreSentinelProps, 'collection'>, RenderProps<TreeLoadMoreItemRenderProps> {
|
|
712
|
+
/**
|
|
713
|
+
* The load more spinner to render when loading additional items.
|
|
714
|
+
*/
|
|
715
|
+
children?: ReactNode | ((values: TreeLoadMoreItemRenderProps & {defaultChildren: ReactNode | undefined}) => ReactNode),
|
|
716
|
+
/**
|
|
717
|
+
* Whether or not the loading spinner should be rendered or not.
|
|
718
|
+
*/
|
|
719
|
+
isLoading?: boolean
|
|
720
|
+
}
|
|
707
721
|
|
|
708
|
-
export const
|
|
722
|
+
export const TreeLoadMoreItem = createLeafComponent('loader', function TreeLoadingSentinel<T extends object>(props: TreeLoadMoreItemProps, ref: ForwardedRef<HTMLDivElement>, item: Node<T>) {
|
|
723
|
+
let {isVirtualized} = useContext(CollectionRendererContext);
|
|
709
724
|
let state = useContext(TreeStateContext)!;
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
let
|
|
725
|
+
let {isLoading, onLoadMore, scrollOffset, ...otherProps} = props;
|
|
726
|
+
let sentinelRef = useRef(null);
|
|
727
|
+
let memoedLoadMoreProps = useMemo(() => ({
|
|
728
|
+
onLoadMore,
|
|
729
|
+
// this collection will update anytime a row is expanded/collapsed becaused the flattenedRows will change.
|
|
730
|
+
// This means onLoadMore will trigger but that might be ok cause the user should have logic to handle multiple loadMore calls
|
|
731
|
+
collection: state?.collection,
|
|
732
|
+
sentinelRef,
|
|
733
|
+
scrollOffset
|
|
734
|
+
}), [onLoadMore, scrollOffset, state?.collection]);
|
|
735
|
+
useLoadMoreSentinel(memoedLoadMoreProps, sentinelRef);
|
|
736
|
+
|
|
737
|
+
ref = useObjectRef<HTMLDivElement>(ref);
|
|
738
|
+
let {rowProps, gridCellProps} = useTreeItem({node: item}, state, ref);
|
|
713
739
|
let level = rowProps['aria-level'] || 1;
|
|
714
740
|
|
|
741
|
+
// For now don't include aria-posinset and aria-setsize on loader since they aren't keyboard focusable
|
|
742
|
+
// Arguably shouldn't include them ever since it might be confusing to the user to include the loaders as part of the
|
|
743
|
+
// item count
|
|
715
744
|
let ariaProps = {
|
|
716
|
-
|
|
717
|
-
'aria-
|
|
718
|
-
'aria-setsize': rowProps['aria-setsize']
|
|
745
|
+
role: 'row',
|
|
746
|
+
'aria-level': rowProps['aria-level']
|
|
719
747
|
};
|
|
720
748
|
|
|
721
749
|
let renderProps = useRenderProps({
|
|
722
|
-
...
|
|
750
|
+
...otherProps,
|
|
723
751
|
id: undefined,
|
|
724
752
|
children: item.rendered,
|
|
725
753
|
defaultClassName: 'react-aria-TreeLoader',
|
|
@@ -727,19 +755,30 @@ export const UNSTABLE_TreeLoadingIndicator = createLeafComponent('loader', funct
|
|
|
727
755
|
level
|
|
728
756
|
}
|
|
729
757
|
});
|
|
758
|
+
let style = {};
|
|
759
|
+
|
|
760
|
+
if (isVirtualized) {
|
|
761
|
+
style = {display: 'contents'};
|
|
762
|
+
}
|
|
730
763
|
|
|
731
764
|
return (
|
|
732
765
|
<>
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
{
|
|
737
|
-
{...renderProps}
|
|
738
|
-
data-level={level}>
|
|
739
|
-
<div role="gridcell" aria-colindex={1}>
|
|
740
|
-
{renderProps.children}
|
|
741
|
-
</div>
|
|
766
|
+
{/* 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) */}
|
|
767
|
+
{/* @ts-ignore - compatibility with React < 19 */}
|
|
768
|
+
<div style={{position: 'relative', width: 0, height: 0}} inert={inertValue(true)} >
|
|
769
|
+
<div data-testid="loadMoreSentinel" ref={sentinelRef} style={{position: 'absolute', height: 1, width: 1}} />
|
|
742
770
|
</div>
|
|
771
|
+
{isLoading && renderProps.children && (
|
|
772
|
+
<div
|
|
773
|
+
ref={ref}
|
|
774
|
+
{...mergeProps(filterDOMProps(props as any), ariaProps)}
|
|
775
|
+
{...renderProps}
|
|
776
|
+
data-level={level}>
|
|
777
|
+
<div {...gridCellProps} style={style}>
|
|
778
|
+
{renderProps.children}
|
|
779
|
+
</div>
|
|
780
|
+
</div>
|
|
781
|
+
)}
|
|
743
782
|
</>
|
|
744
783
|
);
|
|
745
784
|
});
|
|
@@ -759,7 +798,8 @@ interface TreeGridCollectionOptions {
|
|
|
759
798
|
|
|
760
799
|
interface FlattenedTree<T> {
|
|
761
800
|
flattenedRows: Node<T>[],
|
|
762
|
-
keyMap: Map<Key, CollectionNode<T
|
|
801
|
+
keyMap: Map<Key, CollectionNode<T>>,
|
|
802
|
+
itemCount: number
|
|
763
803
|
}
|
|
764
804
|
|
|
765
805
|
function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionOptions): FlattenedTree<T> {
|
|
@@ -768,6 +808,8 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
|
|
|
768
808
|
} = opts;
|
|
769
809
|
let keyMap: Map<Key, CollectionNode<T>> = new Map();
|
|
770
810
|
let flattenedRows: Node<T>[] = [];
|
|
811
|
+
// Need to count the items here because BaseCollection will return the full item count regardless if items are hidden via collapsed rows
|
|
812
|
+
let itemCount = 0;
|
|
771
813
|
|
|
772
814
|
let visitNode = (node: Node<T>) => {
|
|
773
815
|
if (node.type === 'item' || node.type === 'loader') {
|
|
@@ -792,9 +834,14 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
|
|
|
792
834
|
keyMap.set(node.key, node as CollectionNode<T>);
|
|
793
835
|
}
|
|
794
836
|
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
837
|
+
// Grab the modified node from the key map so our flattened list and modified key map point to the same nodes
|
|
838
|
+
let modifiedNode = keyMap.get(node.key) || node;
|
|
839
|
+
if (modifiedNode.level === 0 || (modifiedNode.parentKey != null && expandedKeys.has(modifiedNode.parentKey) && flattenedRows.find(row => row.key === modifiedNode.parentKey))) {
|
|
840
|
+
if (modifiedNode.type === 'item') {
|
|
841
|
+
itemCount++;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
flattenedRows.push(modifiedNode);
|
|
798
845
|
}
|
|
799
846
|
} else if (node.type !== null) {
|
|
800
847
|
keyMap.set(node.key, node as CollectionNode<T>);
|
|
@@ -811,7 +858,8 @@ function flattenTree<T>(collection: TreeCollection<T>, opts: TreeGridCollectionO
|
|
|
811
858
|
|
|
812
859
|
return {
|
|
813
860
|
flattenedRows,
|
|
814
|
-
keyMap
|
|
861
|
+
keyMap,
|
|
862
|
+
itemCount
|
|
815
863
|
};
|
|
816
864
|
}
|
|
817
865
|
|
|
@@ -84,11 +84,15 @@ export class TreeDropTargetDelegate<T> {
|
|
|
84
84
|
if (target.dropPosition === 'before') {
|
|
85
85
|
let keyBefore = this.state!.collection.getKeyBefore(target.key);
|
|
86
86
|
if (keyBefore != null) {
|
|
87
|
-
|
|
87
|
+
let convertedTarget = {
|
|
88
88
|
type: 'item',
|
|
89
89
|
key: keyBefore,
|
|
90
90
|
dropPosition: 'after'
|
|
91
91
|
} as const;
|
|
92
|
+
|
|
93
|
+
if (isValidDropTarget(convertedTarget)) {
|
|
94
|
+
target = convertedTarget;
|
|
95
|
+
}
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
98
|
|
package/src/index.ts
CHANGED
|
@@ -39,7 +39,7 @@ export {DropZone, DropZoneContext} from './DropZone';
|
|
|
39
39
|
export {FieldError, FieldErrorContext} from './FieldError';
|
|
40
40
|
export {FileTrigger} from './FileTrigger';
|
|
41
41
|
export {Form, FormContext} from './Form';
|
|
42
|
-
export {
|
|
42
|
+
export {GridListLoadMoreItem, GridList, GridListItem, GridListContext} from './GridList';
|
|
43
43
|
export {Group, GroupContext} from './Group';
|
|
44
44
|
export {Header, HeaderContext} from './Header';
|
|
45
45
|
export {Heading} from './Heading';
|
|
@@ -49,7 +49,7 @@ export {Collection, createLeafComponent as UNSTABLE_createLeafComponent, createB
|
|
|
49
49
|
export {Keyboard, KeyboardContext} from './Keyboard';
|
|
50
50
|
export {Label, LabelContext} from './Label';
|
|
51
51
|
export {Link, LinkContext} from './Link';
|
|
52
|
-
export {
|
|
52
|
+
export {ListBoxLoadMoreItem, ListBox, ListBoxItem, ListBoxSection, ListBoxContext, ListStateContext} from './ListBox';
|
|
53
53
|
export {Menu, MenuItem, MenuTrigger, MenuSection, MenuContext, MenuStateContext, RootMenuTriggerStateContext, SubmenuTrigger} from './Menu';
|
|
54
54
|
export {Meter, MeterContext} from './Meter';
|
|
55
55
|
export {Modal, ModalOverlay, ModalContext} from './Modal';
|
|
@@ -63,7 +63,7 @@ export {Select, SelectValue, SelectContext, SelectValueContext, SelectStateConte
|
|
|
63
63
|
export {Separator, SeparatorContext} from './Separator';
|
|
64
64
|
export {Slider, SliderOutput, SliderTrack, SliderThumb, SliderContext, SliderOutputContext, SliderTrackContext, SliderStateContext} from './Slider';
|
|
65
65
|
export {Switch, SwitchContext} from './Switch';
|
|
66
|
-
export {
|
|
66
|
+
export {TableLoadMoreItem, Table, Row, Cell, Column, ColumnResizer, TableHeader, TableBody, TableContext, ResizableTableContainer, useTableOptions, TableStateContext, TableColumnResizeStateContext} from './Table';
|
|
67
67
|
export {TableLayout} from './TableLayout';
|
|
68
68
|
export {Tabs, TabList, TabPanel, Tab, TabsContext, TabListStateContext} from './Tabs';
|
|
69
69
|
export {TagGroup, TagGroupContext, TagList, TagListContext, Tag} from './TagGroup';
|
|
@@ -75,7 +75,7 @@ export {ToggleButton, ToggleButtonContext} from './ToggleButton';
|
|
|
75
75
|
export {ToggleButtonGroup, ToggleButtonGroupContext, ToggleGroupStateContext} from './ToggleButtonGroup';
|
|
76
76
|
export {Toolbar, ToolbarContext} from './Toolbar';
|
|
77
77
|
export {TooltipTrigger, Tooltip, TooltipTriggerStateContext, TooltipContext} from './Tooltip';
|
|
78
|
-
export {
|
|
78
|
+
export {TreeLoadMoreItem, Tree, TreeItem, TreeContext, TreeItemContent, TreeStateContext} from './Tree';
|
|
79
79
|
export {useDragAndDrop} from './useDragAndDrop';
|
|
80
80
|
export {DropIndicator, DropIndicatorContext, DragAndDropContext} from './DragAndDrop';
|
|
81
81
|
export {Virtualizer} from './Virtualizer';
|
|
@@ -106,14 +106,14 @@ export type {DropZoneProps, DropZoneRenderProps} from './DropZone';
|
|
|
106
106
|
export type {FieldErrorProps, FieldErrorRenderProps} from './FieldError';
|
|
107
107
|
export type {FileTriggerProps} from './FileTrigger';
|
|
108
108
|
export type {FormProps} from './Form';
|
|
109
|
-
export type {GridListProps, GridListRenderProps, GridListItemProps, GridListItemRenderProps} from './GridList';
|
|
109
|
+
export type {GridListProps, GridListRenderProps, GridListItemProps, GridListItemRenderProps, GridListLoadMoreItemProps} from './GridList';
|
|
110
110
|
export type {GroupProps, GroupRenderProps} from './Group';
|
|
111
111
|
export type {HeadingProps} from './Heading';
|
|
112
112
|
export type {InputProps, InputRenderProps} from './Input';
|
|
113
113
|
export type {SectionProps, CollectionRenderer} from './Collection';
|
|
114
114
|
export type {LabelProps} from './Label';
|
|
115
115
|
export type {LinkProps, LinkRenderProps} from './Link';
|
|
116
|
-
export type {ListBoxProps, ListBoxRenderProps, ListBoxItemProps, ListBoxItemRenderProps, ListBoxSectionProps} from './ListBox';
|
|
116
|
+
export type {ListBoxProps, ListBoxRenderProps, ListBoxItemProps, ListBoxItemRenderProps, ListBoxSectionProps, ListBoxLoadMoreItemProps} from './ListBox';
|
|
117
117
|
export type {MenuProps, MenuItemProps, MenuItemRenderProps, MenuTriggerProps, SubmenuTriggerProps, MenuSectionProps} from './Menu';
|
|
118
118
|
export type {MeterProps, MeterRenderProps} from './Meter';
|
|
119
119
|
export type {ModalOverlayProps, ModalRenderProps} from './Modal';
|
|
@@ -127,7 +127,7 @@ export type {SelectProps, SelectValueProps, SelectValueRenderProps, SelectRender
|
|
|
127
127
|
export type {SeparatorProps} from './Separator';
|
|
128
128
|
export type {SliderOutputProps, SliderProps, SliderRenderProps, SliderThumbProps, SliderTrackProps, SliderTrackRenderProps, SliderThumbRenderProps} from './Slider';
|
|
129
129
|
export type {SwitchProps, SwitchRenderProps} from './Switch';
|
|
130
|
-
export type {TableProps, TableRenderProps, TableHeaderProps, TableBodyProps, TableBodyRenderProps, ResizableTableContainerProps, ColumnProps, ColumnRenderProps, ColumnResizerProps, ColumnResizerRenderProps, RowProps, RowRenderProps, CellProps, CellRenderProps} from './Table';
|
|
130
|
+
export type {TableProps, TableRenderProps, TableHeaderProps, TableBodyProps, TableBodyRenderProps, ResizableTableContainerProps, ColumnProps, ColumnRenderProps, ColumnResizerProps, ColumnResizerRenderProps, RowProps, RowRenderProps, CellProps, CellRenderProps, TableLoadMoreItemProps} from './Table';
|
|
131
131
|
export type {TabListProps, TabListRenderProps, TabPanelProps, TabPanelRenderProps, TabProps, TabsProps, TabRenderProps, TabsRenderProps} from './Tabs';
|
|
132
132
|
export type {TagGroupProps, TagListProps, TagListRenderProps, TagProps, TagRenderProps} from './TagGroup';
|
|
133
133
|
export type {TextAreaProps} from './TextArea';
|
|
@@ -138,7 +138,7 @@ export type {ToggleButtonProps, ToggleButtonRenderProps} from './ToggleButton';
|
|
|
138
138
|
export type {ToggleButtonGroupProps, ToggleButtonGroupRenderProps} from './ToggleButtonGroup';
|
|
139
139
|
export type {ToolbarProps, ToolbarRenderProps} from './Toolbar';
|
|
140
140
|
export type {TooltipProps, TooltipRenderProps, TooltipTriggerComponentProps} from './Tooltip';
|
|
141
|
-
export type {TreeProps, TreeRenderProps, TreeItemProps, TreeItemRenderProps, TreeItemContentProps, TreeItemContentRenderProps} from './Tree';
|
|
141
|
+
export type {TreeProps, TreeRenderProps, TreeItemProps, TreeItemRenderProps, TreeItemContentProps, TreeItemContentRenderProps, TreeLoadMoreItemProps, TreeLoadMoreItemRenderProps} from './Tree';
|
|
142
142
|
export type {DragAndDropHooks, DragAndDropOptions} from './useDragAndDrop';
|
|
143
143
|
export type {DropIndicatorProps, DropIndicatorRenderProps} from './DragAndDrop';
|
|
144
144
|
export type {ContextValue, RenderProps, SlotProps, StyleRenderProps} from './utils';
|
package/src/useDragAndDrop.tsx
CHANGED
|
@@ -50,7 +50,7 @@ interface DragHooks {
|
|
|
50
50
|
useDraggableCollection?: (props: DraggableCollectionOptions, state: DraggableCollectionState, ref: RefObject<HTMLElement | null>) => void,
|
|
51
51
|
useDraggableItem?: (props: DraggableItemProps, state: DraggableCollectionState) => DraggableItemResult,
|
|
52
52
|
DragPreview?: typeof DragPreview,
|
|
53
|
-
renderDragPreview?: (items: DragItem[]) => JSX.Element,
|
|
53
|
+
renderDragPreview?: (items: DragItem[]) => JSX.Element | {element: JSX.Element, x: number, y: number},
|
|
54
54
|
isVirtualDragging?: () => boolean
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -81,7 +81,7 @@ export interface DragAndDropOptions extends Omit<DraggableCollectionProps, 'prev
|
|
|
81
81
|
* A function that renders a drag preview, which is shown under the user's cursor while dragging.
|
|
82
82
|
* By default, a copy of the dragged element is rendered.
|
|
83
83
|
*/
|
|
84
|
-
renderDragPreview?: (items: DragItem[]) => JSX.Element,
|
|
84
|
+
renderDragPreview?: (items: DragItem[]) => JSX.Element | {element: JSX.Element, x: number, y: number},
|
|
85
85
|
/**
|
|
86
86
|
* A function that renders a drop indicator element between two items in a collection.
|
|
87
87
|
* This should render a `<DropIndicator>` element. If this function is not provided, a
|
package/src/utils.tsx
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import {AriaLabelingProps, RefObject, DOMProps as SharedDOMProps} from '@react-types/shared';
|
|
14
14
|
import {mergeProps, mergeRefs, useLayoutEffect, useObjectRef} from '@react-aria/utils';
|
|
15
|
-
import React, {Context, CSSProperties, ForwardedRef, JSX, ReactNode, RefCallback,
|
|
15
|
+
import React, {Context, CSSProperties, ForwardedRef, JSX, ReactNode, RefCallback, useCallback, useContext, useMemo, useRef, useState} from 'react';
|
|
16
16
|
|
|
17
17
|
export const DEFAULT_SLOT = Symbol('default');
|
|
18
18
|
|
|
@@ -63,21 +63,21 @@ export interface DOMProps extends StyleProps, SharedDOMProps {
|
|
|
63
63
|
children?: ReactNode
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
onScroll?: (e: UIEvent<T>) => void
|
|
69
|
-
}
|
|
66
|
+
type ClassNameOrFunction<T> = string | ((values: T & {defaultClassName: string | undefined}) => string);
|
|
67
|
+
type StyleOrFunction<T> = CSSProperties | ((values: T & {defaultStyle: CSSProperties}) => CSSProperties | undefined);
|
|
70
68
|
|
|
71
69
|
export interface StyleRenderProps<T> {
|
|
72
70
|
/** The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state. */
|
|
73
|
-
className?:
|
|
71
|
+
className?: ClassNameOrFunction<T>,
|
|
74
72
|
/** The inline [style](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) for the element. A function may be provided to compute the style based on component state. */
|
|
75
|
-
style?:
|
|
73
|
+
style?: StyleOrFunction<T>
|
|
76
74
|
}
|
|
77
75
|
|
|
76
|
+
type ChildrenOrFunction<T> = ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode);
|
|
77
|
+
|
|
78
78
|
export interface RenderProps<T> extends StyleRenderProps<T> {
|
|
79
79
|
/** The children of the component. A function may be provided to alter the children based on component state. */
|
|
80
|
-
children?:
|
|
80
|
+
children?: ChildrenOrFunction<T>
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
interface RenderPropsHookOptions<T> extends RenderProps<T>, SharedDOMProps, AriaLabelingProps {
|
|
@@ -180,7 +180,7 @@ export function useSlottedContext<T>(context: Context<SlottedContextValue<T>>, s
|
|
|
180
180
|
return ctx;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
export function useContextProps<T, U extends SlotProps, E extends Element>(props: T & SlotProps, ref: ForwardedRef<E
|
|
183
|
+
export function useContextProps<T, U extends SlotProps, E extends Element>(props: T & SlotProps, ref: ForwardedRef<E> | undefined, context: Context<ContextValue<U, E>>): [T, RefObject<E | null>] {
|
|
184
184
|
let ctx = useSlottedContext(context, props.slot) || {};
|
|
185
185
|
// @ts-ignore - TS says "Type 'unique symbol' cannot be used as an index type." but not sure why.
|
|
186
186
|
let {ref: contextRef, ...contextProps} = ctx as any;
|