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/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 {ContextValue, createHideableComponent, forwardRefType, Hidden, RenderProps, SlotProps, StyleRenderProps, useContextProps, useRenderProps} from './utils';
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 InternalTabsContext = createContext<InternalTabsContextValue | null>(null);
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
- <DocumentContext.Provider value={document}>
132
+ <CollectionDocumentContext.Provider value={document}>
140
133
  {children}
141
- </DocumentContext.Provider>
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', keyboardActivation = 'automatic'} = props;
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
- <InternalTabsContext.Provider value={{state, orientation, keyboardActivation}}>
177
+ <Provider
178
+ values={[
179
+ [TabsContext, props],
180
+ [TabListStateContext, state]
181
+ ]}>
185
182
  {renderProps.children}
186
- </InternalTabsContext.Provider>
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(DocumentContext);
195
+ let document = useContext(CollectionDocumentContext);
199
196
  return document
200
- ? <TabListPortal props={props} document={document} />
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 {state, orientation, keyboardActivation} = useContext(InternalTabsContext)!;
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<HTMLDivElement>(item.props.ref);
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 DOMProps = filterDOMProps(item.props);
295
- delete DOMProps.id;
288
+ let ElementType: React.ElementType = item.props.href ? 'a' : 'div';
296
289
 
297
290
  return (
298
- <div
299
- {...mergeProps(DOMProps, tabProps, focusProps, hoverProps, renderProps)}
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 {state} = useContext(InternalTabsContext)!;
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, mergeRefs, useObjectRef} from '@react-aria/utils';
17
+ import {filterDOMProps, mergeProps, useObjectRef} from '@react-aria/utils';
18
18
  import {LabelContext} from './Label';
19
- import {ListState, Node, useListState} from 'react-stately';
20
- import React, {createContext, ForwardedRef, forwardRef, HTMLAttributes, Key, ReactNode, RefObject, useContext, useEffect, useRef} from 'react';
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 InternalTagGroupContext = createContext<InternalTagGroupContextValue | null>(null);
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
- [InternalTagGroupContext, {state, document, gridProps, tagListRef}],
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 {document} = useContext(InternalTagGroupContext)!;
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 {state, gridProps, tagListRef} = useContext(InternalTagGroupContext)!;
132
- let ref = mergeRefs(tagListRef, forwardedRef);
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 {state} = useContext(InternalTagGroupContext)!;
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
@@ -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, DOMAttributes, FocusableElement} from '@react-types/shared';
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
- interface TooltipContextValue {
51
- state: TooltipTriggerState,
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
- <InternalTooltipContext.Provider value={{state, triggerRef: ref, tooltipProps}}>
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
- </InternalTooltipContext.Provider>
78
+ </Provider>
74
79
  );
75
80
  }
76
81
 
77
82
  function Tooltip(props: TooltipProps, ref: ForwardedRef<HTMLDivElement>) {
78
- let {state} = useContext(InternalTooltipContext)!;
79
- let objectRef = useObjectRef(ref);
80
- let isExiting = useExitAnimation(objectRef, state.isOpen);
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={objectRef} isExiting={isExiting} />
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: ForwardedRef<HTMLDivElement>}) {
99
- let {state, triggerRef, tooltipProps: triggerTooltipProps} = useContext(InternalTooltipContext)!;
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(overlayRef, !!placement);
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
- {...mergeProps(triggerTooltipProps, tooltipProps)}
129
- ref={mergeRefs(overlayRef, props.tooltipRef)}
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';
@@ -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 ContextValue<T extends SlotProps, E extends Element> = SlottedValue<WithRef<T, E>> | WithRef<T, E> | null | undefined;
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
- /** A slot name for the component. Slots allow the component to receive props from a parent component. */
138
- slot?: string
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<U extends SlotProps, E extends Element>(context: Context<ContextValue<U, E>>, slot?: string): WithRef<U, E> | null | undefined {
147
+ export function useSlottedContext<T>(context: Context<SlottedContextValue<T>>, slot?: string | null): T | null | undefined {
142
148
  let ctx = useContext(context);
143
- if (ctx && 'slots' in ctx && ctx.slots) {
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
+ }