react-aria-components 1.0.0-beta.0 → 1.0.0-beta.2
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/import.mjs +1160 -855
- package/dist/main.js +1181 -852
- package/dist/main.js.map +1 -1
- package/dist/module.js +1160 -855
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +180 -226
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/Breadcrumbs.tsx +2 -2
- package/src/Button.tsx +1 -1
- package/src/Calendar.tsx +15 -8
- package/src/Checkbox.tsx +5 -5
- package/src/Collection.tsx +14 -7
- package/src/ComboBox.tsx +19 -12
- package/src/DateField.tsx +95 -49
- package/src/DatePicker.tsx +34 -64
- package/src/Dialog.tsx +15 -15
- package/src/DropZone.tsx +6 -3
- package/src/FileTrigger.tsx +11 -10
- package/src/GridList.tsx +9 -13
- package/src/Group.tsx +36 -6
- package/src/Link.tsx +17 -24
- package/src/ListBox.tsx +31 -39
- package/src/Menu.tsx +17 -15
- package/src/Meter.tsx +1 -1
- package/src/Modal.tsx +14 -13
- package/src/NumberField.tsx +5 -3
- package/src/OverlayArrow.tsx +7 -10
- package/src/Popover.tsx +7 -11
- package/src/ProgressBar.tsx +1 -1
- package/src/RadioGroup.tsx +6 -6
- package/src/SearchField.tsx +3 -3
- package/src/Select.tsx +28 -23
- package/src/Separator.tsx +1 -1
- package/src/Slider.tsx +24 -23
- package/src/Switch.tsx +3 -3
- package/src/Table.tsx +30 -30
- package/src/Tabs.tsx +24 -31
- package/src/TagGroup.tsx +18 -21
- package/src/TextField.tsx +3 -3
- package/src/ToggleButton.tsx +1 -1
- package/src/Tooltip.tsx +33 -27
- package/src/index.ts +18 -18
- package/src/useDragAndDrop.tsx +8 -0
- package/src/utils.tsx +37 -10
package/src/Tabs.tsx
CHANGED
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {AriaLabelingProps} from '@react-types/shared';
|
|
13
|
+
import {AriaLabelingProps, LinkDOMProps} from '@react-types/shared';
|
|
14
14
|
import {AriaTabListProps, AriaTabPanelProps, mergeProps, Orientation, useFocusRing, useHover, useTab, useTabList, useTabPanel} from 'react-aria';
|
|
15
|
-
import {BaseCollection, CollectionProps, Document, useCollectionDocument, useCollectionPortal, useSSRCollectionNode} from './Collection';
|
|
16
15
|
import {Collection, Node, TabListState, useTabListState} from 'react-stately';
|
|
17
|
-
import {
|
|
16
|
+
import {CollectionDocumentContext, CollectionPortal, CollectionProps, useCollectionDocument, useSSRCollectionNode} from './Collection';
|
|
17
|
+
import {ContextValue, createHideableComponent, forwardRefType, Hidden, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlottedContext} from './utils';
|
|
18
18
|
import {filterDOMProps, useObjectRef} from '@react-aria/utils';
|
|
19
19
|
import React, {createContext, ForwardedRef, forwardRef, Key, RefObject, useContext, useMemo} from 'react';
|
|
20
20
|
|
|
@@ -42,7 +42,7 @@ export interface TabListRenderProps {
|
|
|
42
42
|
state: TabListState<unknown>
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export interface TabProps extends RenderProps<TabRenderProps>, AriaLabelingProps {
|
|
45
|
+
export interface TabProps extends RenderProps<TabRenderProps>, AriaLabelingProps, LinkDOMProps {
|
|
46
46
|
id?: Key
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -111,15 +111,8 @@ export interface TabPanelRenderProps {
|
|
|
111
111
|
state: TabListState<unknown>
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
interface InternalTabsContextValue {
|
|
115
|
-
state: TabListState<object>,
|
|
116
|
-
orientation: Orientation,
|
|
117
|
-
keyboardActivation: 'automatic' | 'manual'
|
|
118
|
-
}
|
|
119
|
-
|
|
120
114
|
export const TabsContext = createContext<ContextValue<TabsProps, HTMLDivElement>>(null);
|
|
121
|
-
const
|
|
122
|
-
const DocumentContext = createContext<Document<any, BaseCollection<any>> | null>(null);
|
|
115
|
+
export const TabListStateContext = createContext<TabListState<object> | null>(null);
|
|
123
116
|
|
|
124
117
|
function Tabs(props: TabsProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
125
118
|
[props, ref] = useContextProps(props, ref, TabsContext);
|
|
@@ -136,9 +129,9 @@ function Tabs(props: TabsProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
|
136
129
|
{/* Render a hidden copy of the children so that we can build the collection before constructing the state.
|
|
137
130
|
* This should always come before the real DOM content so we have built the collection by the time it renders during SSR. */}
|
|
138
131
|
<Hidden>
|
|
139
|
-
<
|
|
132
|
+
<CollectionDocumentContext.Provider value={document}>
|
|
140
133
|
{children}
|
|
141
|
-
</
|
|
134
|
+
</CollectionDocumentContext.Provider>
|
|
142
135
|
</Hidden>
|
|
143
136
|
<TabsInner props={props} collection={collection} tabsRef={ref} />
|
|
144
137
|
</>
|
|
@@ -152,7 +145,7 @@ interface TabsInnerProps {
|
|
|
152
145
|
}
|
|
153
146
|
|
|
154
147
|
function TabsInner({props, tabsRef: ref, collection}: TabsInnerProps) {
|
|
155
|
-
let {orientation = 'horizontal'
|
|
148
|
+
let {orientation = 'horizontal'} = props;
|
|
156
149
|
let state = useTabListState({
|
|
157
150
|
...props,
|
|
158
151
|
collection,
|
|
@@ -176,14 +169,18 @@ function TabsInner({props, tabsRef: ref, collection}: TabsInnerProps) {
|
|
|
176
169
|
{...focusProps}
|
|
177
170
|
{...renderProps}
|
|
178
171
|
ref={ref}
|
|
179
|
-
slot={props.slot}
|
|
172
|
+
slot={props.slot || undefined}
|
|
180
173
|
data-focused={isFocused || undefined}
|
|
181
174
|
data-orientation={orientation}
|
|
182
175
|
data-focus-visible={isFocusVisible || undefined}
|
|
183
176
|
data-disabled={state.isDisabled || undefined}>
|
|
184
|
-
<
|
|
177
|
+
<Provider
|
|
178
|
+
values={[
|
|
179
|
+
[TabsContext, props],
|
|
180
|
+
[TabListStateContext, state]
|
|
181
|
+
]}>
|
|
185
182
|
{renderProps.children}
|
|
186
|
-
</
|
|
183
|
+
</Provider>
|
|
187
184
|
</div>
|
|
188
185
|
);
|
|
189
186
|
}
|
|
@@ -195,23 +192,20 @@ const _Tabs = /*#__PURE__*/ (forwardRef as forwardRefType)(Tabs);
|
|
|
195
192
|
export {_Tabs as Tabs};
|
|
196
193
|
|
|
197
194
|
function TabList<T extends object>(props: TabListProps<T>, ref: ForwardedRef<HTMLDivElement>): JSX.Element {
|
|
198
|
-
let document = useContext(
|
|
195
|
+
let document = useContext(CollectionDocumentContext);
|
|
199
196
|
return document
|
|
200
|
-
? <
|
|
197
|
+
? <CollectionPortal {...props} />
|
|
201
198
|
: <TabListInner props={props} forwardedRef={ref} />;
|
|
202
199
|
}
|
|
203
200
|
|
|
204
|
-
function TabListPortal({props, document}) {
|
|
205
|
-
return <>{useCollectionPortal(props, document)}</>;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
201
|
interface TabListInnerProps<T> {
|
|
209
202
|
props: TabListProps<T>,
|
|
210
203
|
forwardedRef: ForwardedRef<HTMLDivElement>
|
|
211
204
|
}
|
|
212
205
|
|
|
213
206
|
function TabListInner<T extends object>({props, forwardedRef: ref}: TabListInnerProps<T>) {
|
|
214
|
-
let
|
|
207
|
+
let state = useContext(TabListStateContext)!;
|
|
208
|
+
let {orientation = 'horizontal', keyboardActivation = 'automatic'} = useSlottedContext(TabsContext)!;
|
|
215
209
|
let objectRef = useObjectRef(ref);
|
|
216
210
|
|
|
217
211
|
let {tabListProps} = useTabList({
|
|
@@ -269,7 +263,7 @@ export {_Tab as Tab};
|
|
|
269
263
|
|
|
270
264
|
function TabInner({item, state}: {item: Node<object>, state: TabListState<object>}) {
|
|
271
265
|
let {key} = item;
|
|
272
|
-
let ref = useObjectRef<
|
|
266
|
+
let ref = useObjectRef<any>(item.props.ref);
|
|
273
267
|
let {tabProps, isSelected, isDisabled, isPressed} = useTab({key}, state, ref);
|
|
274
268
|
let {focusProps, isFocused, isFocusVisible} = useFocusRing();
|
|
275
269
|
let {hoverProps, isHovered} = useHover({
|
|
@@ -291,12 +285,11 @@ function TabInner({item, state}: {item: Node<object>, state: TabListState<object
|
|
|
291
285
|
}
|
|
292
286
|
});
|
|
293
287
|
|
|
294
|
-
let
|
|
295
|
-
delete DOMProps.id;
|
|
288
|
+
let ElementType: React.ElementType = item.props.href ? 'a' : 'div';
|
|
296
289
|
|
|
297
290
|
return (
|
|
298
|
-
<
|
|
299
|
-
{...mergeProps(
|
|
291
|
+
<ElementType
|
|
292
|
+
{...mergeProps(tabProps, focusProps, hoverProps, renderProps)}
|
|
300
293
|
ref={ref}
|
|
301
294
|
data-selected={isSelected || undefined}
|
|
302
295
|
data-disabled={isDisabled || undefined}
|
|
@@ -307,7 +300,7 @@ function TabInner({item, state}: {item: Node<object>, state: TabListState<object
|
|
|
307
300
|
}
|
|
308
301
|
|
|
309
302
|
function TabPanel(props: TabPanelProps, forwardedRef: ForwardedRef<HTMLDivElement>) {
|
|
310
|
-
const
|
|
303
|
+
const state = useContext(TabListStateContext)!;
|
|
311
304
|
let ref = useObjectRef<HTMLDivElement>(forwardedRef);
|
|
312
305
|
let {tabPanelProps} = useTabPanel(props, state, ref);
|
|
313
306
|
let {focusProps, isFocused, isFocusVisible} = useFocusRing();
|
package/src/TagGroup.tsx
CHANGED
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {AriaTagGroupProps, useFocusRing, useHover, useTag, useTagGroup} from 'react-aria';
|
|
14
|
-
import {BaseCollection, CollectionProps, Document, ItemProps, ItemRenderProps, useCachedChildren, useCollectionDocument, useCollectionPortal, useSSRCollectionNode} from './Collection';
|
|
15
14
|
import {ButtonContext} from './Button';
|
|
15
|
+
import {CollectionDocumentContext, CollectionProps, ItemProps, ItemRenderProps, useCachedChildren, useCollectionDocument, useCollectionPortal, useSSRCollectionNode} from './Collection';
|
|
16
16
|
import {ContextValue, DOMProps, forwardRefType, Provider, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps, useSlot} from './utils';
|
|
17
|
-
import {filterDOMProps, mergeProps,
|
|
17
|
+
import {filterDOMProps, mergeProps, useObjectRef} from '@react-aria/utils';
|
|
18
18
|
import {LabelContext} from './Label';
|
|
19
|
-
import {
|
|
20
|
-
import
|
|
19
|
+
import {LinkDOMProps} from '@react-types/shared';
|
|
20
|
+
import {ListStateContext} from './ListBox';
|
|
21
|
+
import {Node, useListState} from 'react-stately';
|
|
22
|
+
import React, {createContext, ForwardedRef, forwardRef, Key, ReactNode, useContext, useEffect, useRef} from 'react';
|
|
21
23
|
import {TextContext} from './Text';
|
|
22
24
|
|
|
23
25
|
export interface TagGroupProps extends Omit<AriaTagGroupProps<unknown>, 'children' | 'items' | 'label' | 'description' | 'errorMessage' | 'keyboardDelegate'>, DOMProps, SlotProps {}
|
|
@@ -45,15 +47,8 @@ export interface TagListProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'
|
|
|
45
47
|
renderEmptyState?: () => ReactNode
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
interface InternalTagGroupContextValue {
|
|
49
|
-
state: ListState<any>,
|
|
50
|
-
document: Document<any, BaseCollection<any>>,
|
|
51
|
-
gridProps: HTMLAttributes<HTMLElement>,
|
|
52
|
-
tagListRef: RefObject<HTMLDivElement>
|
|
53
|
-
}
|
|
54
|
-
|
|
55
50
|
export const TagGroupContext = createContext<ContextValue<TagGroupProps, HTMLDivElement>>(null);
|
|
56
|
-
const
|
|
51
|
+
export const TagListContext = createContext<ContextValue<TagListProps<any>, HTMLDivElement>>(null);
|
|
57
52
|
|
|
58
53
|
function TagGroup(props: TagGroupProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
59
54
|
[props, ref] = useContextProps(props, ref, TagGroupContext);
|
|
@@ -84,13 +79,15 @@ function TagGroup(props: TagGroupProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
|
84
79
|
<div
|
|
85
80
|
{...domProps}
|
|
86
81
|
ref={ref}
|
|
87
|
-
slot={props.slot}
|
|
82
|
+
slot={props.slot || undefined}
|
|
88
83
|
className={props.className ?? 'react-aria-TagGroup'}
|
|
89
84
|
style={props.style}>
|
|
90
85
|
<Provider
|
|
91
86
|
values={[
|
|
92
87
|
[LabelContext, {...labelProps, elementType: 'span', ref: labelRef}],
|
|
93
|
-
[
|
|
88
|
+
[TagListContext, {...gridProps, ref: tagListRef}],
|
|
89
|
+
[ListStateContext, state],
|
|
90
|
+
[CollectionDocumentContext, document],
|
|
94
91
|
[TextContext, {
|
|
95
92
|
slots: {
|
|
96
93
|
description: descriptionProps,
|
|
@@ -112,8 +109,7 @@ export {_TagGroup as TagGroup};
|
|
|
112
109
|
|
|
113
110
|
function TagList<T extends object>(props: TagListProps<T>, forwardedRef: ForwardedRef<HTMLDivElement>) {
|
|
114
111
|
// Render the portal first so that we have the collection by the time we render the DOM in SSR.
|
|
115
|
-
let
|
|
116
|
-
let portal = useCollectionPortal(props, document);
|
|
112
|
+
let portal = useCollectionPortal(props);
|
|
117
113
|
return (
|
|
118
114
|
<>
|
|
119
115
|
{portal}
|
|
@@ -128,8 +124,10 @@ interface TagListInnerProps<T> {
|
|
|
128
124
|
}
|
|
129
125
|
|
|
130
126
|
function TagListInner<T extends object>({props, forwardedRef}: TagListInnerProps<T>) {
|
|
131
|
-
let
|
|
132
|
-
let ref =
|
|
127
|
+
let state = useContext(ListStateContext)!;
|
|
128
|
+
let [gridProps, ref] = useContextProps(props, forwardedRef, TagListContext);
|
|
129
|
+
delete gridProps.items;
|
|
130
|
+
delete gridProps.renderEmptyState;
|
|
133
131
|
|
|
134
132
|
let children = useCachedChildren({
|
|
135
133
|
items: state.collection,
|
|
@@ -159,7 +157,6 @@ function TagListInner<T extends object>({props, forwardedRef}: TagListInnerProps
|
|
|
159
157
|
<div
|
|
160
158
|
{...mergeProps(gridProps, focusProps)}
|
|
161
159
|
{...renderProps}
|
|
162
|
-
{...filterDOMProps(props as any)}
|
|
163
160
|
ref={ref}
|
|
164
161
|
data-empty={state.collection.size === 0 || undefined}
|
|
165
162
|
data-focused={isFocused || undefined}
|
|
@@ -183,7 +180,7 @@ export interface TagRenderProps extends Omit<ItemRenderProps, 'allowsDragging' |
|
|
|
183
180
|
allowsRemoving: boolean
|
|
184
181
|
}
|
|
185
182
|
|
|
186
|
-
export interface TagProps extends RenderProps<TagRenderProps
|
|
183
|
+
export interface TagProps extends RenderProps<TagRenderProps>, LinkDOMProps {
|
|
187
184
|
/** A unique id for the tag. */
|
|
188
185
|
id?: Key,
|
|
189
186
|
/**
|
|
@@ -204,7 +201,7 @@ const _Tag = /*#__PURE__*/ (forwardRef as forwardRefType)(Tag);
|
|
|
204
201
|
export {_Tag as Tag};
|
|
205
202
|
|
|
206
203
|
function TagItem({item}) {
|
|
207
|
-
let
|
|
204
|
+
let state = useContext(ListStateContext)!;
|
|
208
205
|
let ref = useObjectRef<HTMLDivElement>(item.props.ref);
|
|
209
206
|
let {focusProps, isFocusVisible} = useFocusRing({within: true});
|
|
210
207
|
let {rowProps, gridCellProps, removeButtonProps, ...states} = useTag({item}, state, ref);
|
package/src/TextField.tsx
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {AriaTextFieldProps, useTextField} from 'react-aria';
|
|
14
|
-
import {ContextValue, DOMProps, forwardRefType, Provider, RenderProps, SlotProps, useContextProps, useRenderProps, useSlot} from './utils';
|
|
14
|
+
import {ContextValue, DOMProps, forwardRefType, Provider, removeDataAttributes, RenderProps, SlotProps, useContextProps, useRenderProps, useSlot} from './utils';
|
|
15
15
|
import {filterDOMProps} from '@react-aria/utils';
|
|
16
16
|
import {InputContext} from './Input';
|
|
17
17
|
import {LabelContext} from './Label';
|
|
@@ -45,7 +45,7 @@ function TextField(props: TextFieldProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
|
45
45
|
let [labelRef, label] = useSlot();
|
|
46
46
|
let [inputElementType, setInputElementType] = useState('input');
|
|
47
47
|
let {labelProps, inputProps, descriptionProps, errorMessageProps} = useTextField<any>({
|
|
48
|
-
...props,
|
|
48
|
+
...removeDataAttributes(props),
|
|
49
49
|
inputElementType,
|
|
50
50
|
label
|
|
51
51
|
}, inputRef);
|
|
@@ -73,7 +73,7 @@ function TextField(props: TextFieldProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
|
73
73
|
{...filterDOMProps(props)}
|
|
74
74
|
{...renderProps}
|
|
75
75
|
ref={ref}
|
|
76
|
-
slot={props.slot}
|
|
76
|
+
slot={props.slot || undefined}
|
|
77
77
|
data-disabled={props.isDisabled || undefined}
|
|
78
78
|
data-invalid={props.isInvalid || undefined}>
|
|
79
79
|
<Provider
|
package/src/ToggleButton.tsx
CHANGED
|
@@ -49,7 +49,7 @@ function ToggleButton(props: ToggleButtonProps, ref: ForwardedRef<HTMLButtonElem
|
|
|
49
49
|
{...mergeProps(buttonProps, focusProps, hoverProps)}
|
|
50
50
|
{...renderProps}
|
|
51
51
|
ref={ref}
|
|
52
|
-
slot={props.slot}
|
|
52
|
+
slot={props.slot || undefined}
|
|
53
53
|
data-focused={isFocused || undefined}
|
|
54
54
|
data-disabled={props.isDisabled || undefined}
|
|
55
55
|
data-pressed={isPressed || undefined}
|
package/src/Tooltip.tsx
CHANGED
|
@@ -10,20 +10,26 @@
|
|
|
10
10
|
* governing permissions and limitations under the License.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {AriaLabelingProps,
|
|
13
|
+
import {AriaLabelingProps, FocusableElement} from '@react-types/shared';
|
|
14
|
+
import {ContextValue, forwardRefType, Provider, RenderProps, useContextProps, useEnterAnimation, useExitAnimation, useRenderProps} from './utils';
|
|
14
15
|
import {FocusableProvider} from '@react-aria/focus';
|
|
15
|
-
import {forwardRefType, RenderProps, useEnterAnimation, useExitAnimation, useRenderProps} from './utils';
|
|
16
16
|
import {mergeProps, OverlayContainer, PlacementAxis, PositionProps, useOverlayPosition, useTooltip, useTooltipTrigger} from 'react-aria';
|
|
17
|
-
import {mergeRefs, useObjectRef} from '@react-aria/utils';
|
|
18
17
|
import {OverlayArrowContext} from './OverlayArrow';
|
|
18
|
+
import {OverlayTriggerProps, TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately';
|
|
19
19
|
import React, {createContext, ForwardedRef, forwardRef, ReactNode, RefObject, useContext, useRef} from 'react';
|
|
20
|
-
import {TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately';
|
|
21
20
|
|
|
22
21
|
export interface TooltipTriggerComponentProps extends TooltipTriggerProps {
|
|
23
22
|
children: ReactNode
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
export interface TooltipProps extends PositionProps, AriaLabelingProps, RenderProps<TooltipRenderProps> {
|
|
25
|
+
export interface TooltipProps extends PositionProps, OverlayTriggerProps, AriaLabelingProps, RenderProps<TooltipRenderProps> {
|
|
26
|
+
/**
|
|
27
|
+
* The ref for the element which the tooltip positions itself with respect to.
|
|
28
|
+
*
|
|
29
|
+
* When used within a TooltipTrigger this is set automatically. It is only required when used standalone.
|
|
30
|
+
*/
|
|
31
|
+
triggerRef?: RefObject<Element>
|
|
32
|
+
}
|
|
27
33
|
|
|
28
34
|
export interface TooltipRenderProps {
|
|
29
35
|
/**
|
|
@@ -47,13 +53,8 @@ export interface TooltipRenderProps {
|
|
|
47
53
|
state: TooltipTriggerState
|
|
48
54
|
}
|
|
49
55
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
triggerRef: RefObject<FocusableElement>,
|
|
53
|
-
tooltipProps: DOMAttributes
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const InternalTooltipContext = createContext<TooltipContextValue | null>(null);
|
|
56
|
+
export const TooltipTriggerStateContext = createContext<TooltipTriggerState | null>(null);
|
|
57
|
+
export const TooltipContext = createContext<ContextValue<TooltipProps, HTMLDivElement>>(null);
|
|
57
58
|
|
|
58
59
|
/**
|
|
59
60
|
* TooltipTrigger wraps around a trigger element and a Tooltip. It handles opening and closing
|
|
@@ -66,25 +67,31 @@ export function TooltipTrigger(props: TooltipTriggerComponentProps) {
|
|
|
66
67
|
let {triggerProps, tooltipProps} = useTooltipTrigger(props, state, ref);
|
|
67
68
|
|
|
68
69
|
return (
|
|
69
|
-
<
|
|
70
|
+
<Provider
|
|
71
|
+
values={[
|
|
72
|
+
[TooltipTriggerStateContext, state],
|
|
73
|
+
[TooltipContext, {...tooltipProps, triggerRef: ref}]
|
|
74
|
+
]}>
|
|
70
75
|
<FocusableProvider {...triggerProps} ref={ref}>
|
|
71
76
|
{props.children}
|
|
72
77
|
</FocusableProvider>
|
|
73
|
-
</
|
|
78
|
+
</Provider>
|
|
74
79
|
);
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
function Tooltip(props: TooltipProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
78
|
-
|
|
79
|
-
let
|
|
80
|
-
let
|
|
83
|
+
[props, ref] = useContextProps(props, ref, TooltipContext);
|
|
84
|
+
let contextState = useContext(TooltipTriggerStateContext);
|
|
85
|
+
let localState = useTooltipTriggerState(props);
|
|
86
|
+
let state = props.isOpen != null || props.defaultOpen != null || !contextState ? localState : contextState;
|
|
87
|
+
let isExiting = useExitAnimation(ref, state.isOpen);
|
|
81
88
|
if (!state.isOpen && !isExiting) {
|
|
82
89
|
return null;
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
return (
|
|
86
93
|
<OverlayContainer>
|
|
87
|
-
<TooltipInner {...props} tooltipRef={
|
|
94
|
+
<TooltipInner {...props} tooltipRef={ref} isExiting={isExiting} />
|
|
88
95
|
</OverlayContainer>
|
|
89
96
|
);
|
|
90
97
|
}
|
|
@@ -95,20 +102,19 @@ function Tooltip(props: TooltipProps, ref: ForwardedRef<HTMLDivElement>) {
|
|
|
95
102
|
const _Tooltip = /*#__PURE__*/ (forwardRef as forwardRefType)(Tooltip);
|
|
96
103
|
export {_Tooltip as Tooltip};
|
|
97
104
|
|
|
98
|
-
function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef:
|
|
99
|
-
let
|
|
105
|
+
function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: RefObject<HTMLDivElement>}) {
|
|
106
|
+
let state = useContext(TooltipTriggerStateContext)!;
|
|
100
107
|
|
|
101
|
-
let overlayRef = useRef<HTMLDivElement>(null);
|
|
102
108
|
let {overlayProps, arrowProps, placement} = useOverlayPosition({
|
|
103
109
|
placement: props.placement || 'top',
|
|
104
|
-
targetRef: triggerRef
|
|
105
|
-
overlayRef,
|
|
110
|
+
targetRef: props.triggerRef!,
|
|
111
|
+
overlayRef: props.tooltipRef,
|
|
106
112
|
offset: props.offset,
|
|
107
113
|
crossOffset: props.crossOffset,
|
|
108
114
|
isOpen: state.isOpen
|
|
109
115
|
});
|
|
110
116
|
|
|
111
|
-
let isEntering = useEnterAnimation(
|
|
117
|
+
let isEntering = useEnterAnimation(props.tooltipRef, !!placement);
|
|
112
118
|
let renderProps = useRenderProps({
|
|
113
119
|
...props,
|
|
114
120
|
defaultClassName: 'react-aria-Tooltip',
|
|
@@ -125,14 +131,14 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: For
|
|
|
125
131
|
|
|
126
132
|
return (
|
|
127
133
|
<div
|
|
128
|
-
{...
|
|
129
|
-
ref={
|
|
134
|
+
{...tooltipProps}
|
|
135
|
+
ref={props.tooltipRef}
|
|
130
136
|
{...renderProps}
|
|
131
137
|
style={{...renderProps.style, ...overlayProps.style}}
|
|
132
138
|
data-placement={placement}
|
|
133
139
|
data-entering={isEntering || undefined}
|
|
134
140
|
data-exiting={props.isExiting || undefined}>
|
|
135
|
-
<OverlayArrowContext.Provider value={{arrowProps, placement}}>
|
|
141
|
+
<OverlayArrowContext.Provider value={{...arrowProps, placement}}>
|
|
136
142
|
{renderProps.children}
|
|
137
143
|
</OverlayArrowContext.Provider>
|
|
138
144
|
</div>
|
package/src/index.ts
CHANGED
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
export {Breadcrumbs, BreadcrumbsContext, Breadcrumb} from './Breadcrumbs';
|
|
14
14
|
export {Button, ButtonContext} from './Button';
|
|
15
|
-
export {Calendar, CalendarGrid, CalendarGridHeader, CalendarGridBody, CalendarHeaderCell, CalendarCell, RangeCalendar, CalendarContext, RangeCalendarContext} from './Calendar';
|
|
16
|
-
export {Checkbox, CheckboxGroup, CheckboxGroupContext, CheckboxContext} from './Checkbox';
|
|
17
|
-
export {ComboBox, ComboBoxContext} from './ComboBox';
|
|
18
|
-
export {DateField, DateInput, DateSegment, TimeField, DateFieldContext, TimeFieldContext} from './DateField';
|
|
19
|
-
export {DatePicker, DateRangePicker, DatePickerContext, DateRangePickerContext} from './DatePicker';
|
|
20
|
-
export {DialogTrigger, Dialog, DialogContext} from './Dialog';
|
|
15
|
+
export {Calendar, CalendarGrid, CalendarGridHeader, CalendarGridBody, CalendarHeaderCell, CalendarCell, RangeCalendar, CalendarContext, RangeCalendarContext, CalendarStateContext, RangeCalendarStateContext} from './Calendar';
|
|
16
|
+
export {Checkbox, CheckboxGroup, CheckboxGroupContext, CheckboxContext, CheckboxGroupStateContext} from './Checkbox';
|
|
17
|
+
export {ComboBox, ComboBoxContext, ComboBoxStateContext} from './ComboBox';
|
|
18
|
+
export {DateField, DateInput, DateSegment, TimeField, DateFieldContext, TimeFieldContext, DateFieldStateContext, TimeFieldStateContext} from './DateField';
|
|
19
|
+
export {DatePicker, DateRangePicker, DatePickerContext, DateRangePickerContext, DatePickerStateContext, DateRangePickerStateContext} from './DatePicker';
|
|
20
|
+
export {DialogTrigger, Dialog, DialogContext, OverlayTriggerStateContext} from './Dialog';
|
|
21
21
|
export {DropZone, DropZoneContext} from './DropZone';
|
|
22
22
|
export {FileTrigger} from './FileTrigger';
|
|
23
23
|
export {GridList, GridListContext} from './GridList';
|
|
@@ -29,31 +29,31 @@ export {Item, Section, Collection} from './Collection';
|
|
|
29
29
|
export {Keyboard, KeyboardContext} from './Keyboard';
|
|
30
30
|
export {Label, LabelContext} from './Label';
|
|
31
31
|
export {Link, LinkContext} from './Link';
|
|
32
|
-
export {ListBox, ListBoxContext} from './ListBox';
|
|
33
|
-
export {Menu, MenuTrigger, MenuContext} from './Menu';
|
|
32
|
+
export {ListBox, ListBoxContext, ListStateContext} from './ListBox';
|
|
33
|
+
export {Menu, MenuTrigger, MenuContext, MenuStateContext} from './Menu';
|
|
34
34
|
export {Meter, MeterContext} from './Meter';
|
|
35
35
|
export {Modal, ModalOverlay, ModalContext} from './Modal';
|
|
36
|
-
export {NumberField, NumberFieldContext} from './NumberField';
|
|
36
|
+
export {NumberField, NumberFieldContext, NumberFieldStateContext} from './NumberField';
|
|
37
37
|
export {OverlayArrow} from './OverlayArrow';
|
|
38
38
|
export {Popover, PopoverContext} from './Popover';
|
|
39
39
|
export {ProgressBar, ProgressBarContext} from './ProgressBar';
|
|
40
40
|
export {Provider, useContextProps, useSlottedContext} from './utils';
|
|
41
|
-
export {RadioGroup, Radio, RadioGroupContext, RadioContext} from './RadioGroup';
|
|
41
|
+
export {RadioGroup, Radio, RadioGroupContext, RadioContext, RadioGroupStateContext} from './RadioGroup';
|
|
42
42
|
export {SearchField, SearchFieldContext} from './SearchField';
|
|
43
|
-
export {Select, SelectValue, SelectContext} from './Select';
|
|
43
|
+
export {Select, SelectValue, SelectContext, SelectValueContext, SelectStateContext} from './Select';
|
|
44
44
|
export {Separator, SeparatorContext} from './Separator';
|
|
45
|
-
export {Slider, SliderOutput, SliderTrack, SliderThumb, SliderContext} from './Slider';
|
|
45
|
+
export {Slider, SliderOutput, SliderTrack, SliderThumb, SliderContext, SliderOutputContext, SliderTrackContext, SliderStateContext} from './Slider';
|
|
46
46
|
export {Switch, SwitchContext} from './Switch';
|
|
47
|
-
export {Table, Row, Cell, Column, ColumnResizer, TableHeader, TableBody, TableContext, ResizableTableContainer, useTableOptions} from './Table';
|
|
48
|
-
export {Tabs, TabList, TabPanel, Tab, TabsContext} from './Tabs';
|
|
49
|
-
export {TagGroup, TagGroupContext, TagList, Tag} from './TagGroup';
|
|
47
|
+
export {Table, Row, Cell, Column, ColumnResizer, TableHeader, TableBody, TableContext, ResizableTableContainer, useTableOptions, TableStateContext, TableColumnResizeStateContext} from './Table';
|
|
48
|
+
export {Tabs, TabList, TabPanel, Tab, TabsContext, TabListStateContext} from './Tabs';
|
|
49
|
+
export {TagGroup, TagGroupContext, TagList, TagListContext, Tag} from './TagGroup';
|
|
50
50
|
export {Text, TextContext} from './Text';
|
|
51
51
|
export {TextArea, TextAreaContext} from './TextArea';
|
|
52
52
|
export {TextField, TextFieldContext} from './TextField';
|
|
53
53
|
export {ToggleButton, ToggleButtonContext} from './ToggleButton';
|
|
54
|
-
export {TooltipTrigger, Tooltip} from './Tooltip';
|
|
55
|
-
export {useDragAndDrop, DropIndicator, DropIndicatorContext} from './useDragAndDrop';
|
|
56
|
-
export {DIRECTORY_DRAG_TYPE, isDirectoryDropItem, isFileDropItem, isTextDropItem, SSRProvider} from 'react-aria';
|
|
54
|
+
export {TooltipTrigger, Tooltip, TooltipTriggerStateContext, TooltipContext} from './Tooltip';
|
|
55
|
+
export {useDragAndDrop, DropIndicator, DropIndicatorContext, DragAndDropContext} from './useDragAndDrop';
|
|
56
|
+
export {DIRECTORY_DRAG_TYPE, isDirectoryDropItem, isFileDropItem, isTextDropItem, SSRProvider, RouterProvider, I18nProvider} from 'react-aria';
|
|
57
57
|
|
|
58
58
|
export type {BreadcrumbsProps, BreadcrumbProps} from './Breadcrumbs';
|
|
59
59
|
export type {ButtonProps, ButtonRenderProps} from './Button';
|
package/src/useDragAndDrop.tsx
CHANGED
|
@@ -170,3 +170,11 @@ function DropIndicator(props: DropIndicatorProps, ref: ForwardedRef<HTMLElement>
|
|
|
170
170
|
*/
|
|
171
171
|
const _DropIndicator = forwardRef(DropIndicator);
|
|
172
172
|
export {_DropIndicator as DropIndicator};
|
|
173
|
+
|
|
174
|
+
export interface DragAndDropContextValue {
|
|
175
|
+
dragAndDropHooks?: DragAndDropHooks,
|
|
176
|
+
dragState?: DraggableCollectionState,
|
|
177
|
+
dropState?: DroppableCollectionState
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export const DragAndDropContext = createContext<DragAndDropContextValue>({});
|
package/src/utils.tsx
CHANGED
|
@@ -31,10 +31,11 @@ interface SlottedValue<T> {
|
|
|
31
31
|
[slotCallbackSymbol]?: (value: T) => void
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export type
|
|
34
|
+
export type SlottedContextValue<T> = SlottedValue<T> | T | null | undefined;
|
|
35
|
+
export type ContextValue<T, E extends Element> = SlottedContextValue<WithRef<T, E>>;
|
|
35
36
|
|
|
36
37
|
type ProviderValue<T> = [Context<T>, T];
|
|
37
|
-
type ProviderValues<A, B, C, D, E, F, G, H> =
|
|
38
|
+
type ProviderValues<A, B, C, D, E, F, G, H, I, J> =
|
|
38
39
|
| [ProviderValue<A>]
|
|
39
40
|
| [ProviderValue<A>, ProviderValue<B>]
|
|
40
41
|
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>]
|
|
@@ -42,14 +43,16 @@ type ProviderValues<A, B, C, D, E, F, G, H> =
|
|
|
42
43
|
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>]
|
|
43
44
|
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>]
|
|
44
45
|
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>, ProviderValue<G>]
|
|
45
|
-
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>, ProviderValue<G>, ProviderValue<H>]
|
|
46
|
+
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>, ProviderValue<G>, ProviderValue<H>]
|
|
47
|
+
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>, ProviderValue<G>, ProviderValue<H>, ProviderValue<I>]
|
|
48
|
+
| [ProviderValue<A>, ProviderValue<B>, ProviderValue<C>, ProviderValue<D>, ProviderValue<E>, ProviderValue<F>, ProviderValue<G>, ProviderValue<H>, ProviderValue<I>, ProviderValue<J>];
|
|
46
49
|
|
|
47
|
-
interface ProviderProps<A, B, C, D, E, F, G, H> {
|
|
48
|
-
values: ProviderValues<A, B, C, D, E, F, G, H>,
|
|
50
|
+
interface ProviderProps<A, B, C, D, E, F, G, H, I, J> {
|
|
51
|
+
values: ProviderValues<A, B, C, D, E, F, G, H, I, J>,
|
|
49
52
|
children: ReactNode
|
|
50
53
|
}
|
|
51
54
|
|
|
52
|
-
export function Provider<A, B, C, D, E, F, G, H>({values, children}: ProviderProps<A, B, C, D, E, F, G, H>): JSX.Element {
|
|
55
|
+
export function Provider<A, B, C, D, E, F, G, H, I, J>({values, children}: ProviderProps<A, B, C, D, E, F, G, H, I, J>): JSX.Element {
|
|
53
56
|
for (let [Context, value] of values) {
|
|
54
57
|
// @ts-ignore
|
|
55
58
|
children = <Context.Provider value={value}>{children}</Context.Provider>;
|
|
@@ -134,13 +137,20 @@ export function useRenderProps<T>(props: RenderPropsHookOptions<T>) {
|
|
|
134
137
|
|
|
135
138
|
export type WithRef<T, E> = T & {ref?: ForwardedRef<E>};
|
|
136
139
|
export interface SlotProps {
|
|
137
|
-
/**
|
|
138
|
-
|
|
140
|
+
/**
|
|
141
|
+
* A slot name for the component. Slots allow the component to receive props from a parent component.
|
|
142
|
+
* An explicit `null` value indicates that the local props completely override all props received from a parent.
|
|
143
|
+
*/
|
|
144
|
+
slot?: string | null
|
|
139
145
|
}
|
|
140
146
|
|
|
141
|
-
export function useSlottedContext<
|
|
147
|
+
export function useSlottedContext<T>(context: Context<SlottedContextValue<T>>, slot?: string | null): T | null | undefined {
|
|
142
148
|
let ctx = useContext(context);
|
|
143
|
-
if (
|
|
149
|
+
if (slot === null) {
|
|
150
|
+
// An explicit `null` slot means don't use context.
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if (ctx && typeof ctx === 'object' && 'slots' in ctx && ctx.slots) {
|
|
144
154
|
if (!slot && !ctx.slots[defaultSlot]) {
|
|
145
155
|
throw new Error('A slot prop is required');
|
|
146
156
|
}
|
|
@@ -326,3 +336,20 @@ export function createHideableComponent<T, P = {}>(fn: (props: P, ref: React.Ref
|
|
|
326
336
|
Wrapper.displayName = fn.displayName || fn.name;
|
|
327
337
|
return (React.forwardRef as forwardRefType)(Wrapper);
|
|
328
338
|
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Filters out `data-*` attributes to keep them from being passed down and duplicated.
|
|
342
|
+
* @param props
|
|
343
|
+
*/
|
|
344
|
+
export function removeDataAttributes<T>(props: T): T {
|
|
345
|
+
const prefix = /^(data-.*)$/;
|
|
346
|
+
let filteredProps = {} as T;
|
|
347
|
+
|
|
348
|
+
for (const prop in props) {
|
|
349
|
+
if (!prefix.test(prop)) {
|
|
350
|
+
filteredProps[prop] = props[prop];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return filteredProps;
|
|
355
|
+
}
|