react-aria-components 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/dist/Breadcrumbs.main.js +3 -2
  2. package/dist/Breadcrumbs.main.js.map +1 -1
  3. package/dist/Breadcrumbs.mjs +4 -3
  4. package/dist/Breadcrumbs.module.js +4 -3
  5. package/dist/Breadcrumbs.module.js.map +1 -1
  6. package/dist/Button.main.js +1 -1
  7. package/dist/Button.main.js.map +1 -1
  8. package/dist/Button.mjs +2 -2
  9. package/dist/Button.module.js +2 -2
  10. package/dist/Button.module.js.map +1 -1
  11. package/dist/Calendar.main.js +11 -7
  12. package/dist/Calendar.main.js.map +1 -1
  13. package/dist/Calendar.mjs +12 -8
  14. package/dist/Calendar.module.js +12 -8
  15. package/dist/Calendar.module.js.map +1 -1
  16. package/dist/Checkbox.main.js +2 -2
  17. package/dist/Checkbox.main.js.map +1 -1
  18. package/dist/Checkbox.mjs +3 -3
  19. package/dist/Checkbox.module.js +3 -3
  20. package/dist/Checkbox.module.js.map +1 -1
  21. package/dist/ColorArea.main.js +1 -1
  22. package/dist/ColorArea.main.js.map +1 -1
  23. package/dist/ColorArea.mjs +2 -2
  24. package/dist/ColorArea.module.js +2 -2
  25. package/dist/ColorArea.module.js.map +1 -1
  26. package/dist/ColorField.main.js +7 -3
  27. package/dist/ColorField.main.js.map +1 -1
  28. package/dist/ColorField.mjs +8 -4
  29. package/dist/ColorField.module.js +8 -4
  30. package/dist/ColorField.module.js.map +1 -1
  31. package/dist/ColorSlider.main.js +1 -1
  32. package/dist/ColorSlider.main.js.map +1 -1
  33. package/dist/ColorSlider.mjs +2 -2
  34. package/dist/ColorSlider.module.js +2 -2
  35. package/dist/ColorSlider.module.js.map +1 -1
  36. package/dist/ColorSwatch.main.js +1 -1
  37. package/dist/ColorSwatch.main.js.map +1 -1
  38. package/dist/ColorSwatch.mjs +2 -2
  39. package/dist/ColorSwatch.module.js +2 -2
  40. package/dist/ColorSwatch.module.js.map +1 -1
  41. package/dist/ColorSwatchPicker.main.js +2 -0
  42. package/dist/ColorSwatchPicker.main.js.map +1 -1
  43. package/dist/ColorSwatchPicker.mjs +2 -0
  44. package/dist/ColorSwatchPicker.module.js +2 -0
  45. package/dist/ColorSwatchPicker.module.js.map +1 -1
  46. package/dist/ColorThumb.main.js +1 -1
  47. package/dist/ColorThumb.main.js.map +1 -1
  48. package/dist/ColorThumb.mjs +2 -2
  49. package/dist/ColorThumb.module.js +2 -2
  50. package/dist/ColorThumb.module.js.map +1 -1
  51. package/dist/ColorWheel.main.js +2 -2
  52. package/dist/ColorWheel.main.js.map +1 -1
  53. package/dist/ColorWheel.mjs +3 -3
  54. package/dist/ColorWheel.module.js +3 -3
  55. package/dist/ColorWheel.module.js.map +1 -1
  56. package/dist/ComboBox.main.js +2 -2
  57. package/dist/ComboBox.main.js.map +1 -1
  58. package/dist/ComboBox.mjs +3 -3
  59. package/dist/ComboBox.module.js +3 -3
  60. package/dist/ComboBox.module.js.map +1 -1
  61. package/dist/DateField.main.js +3 -3
  62. package/dist/DateField.main.js.map +1 -1
  63. package/dist/DateField.mjs +4 -4
  64. package/dist/DateField.module.js +4 -4
  65. package/dist/DateField.module.js.map +1 -1
  66. package/dist/DatePicker.main.js +2 -2
  67. package/dist/DatePicker.main.js.map +1 -1
  68. package/dist/DatePicker.mjs +3 -3
  69. package/dist/DatePicker.module.js +3 -3
  70. package/dist/DatePicker.module.js.map +1 -1
  71. package/dist/Dialog.main.js +2 -1
  72. package/dist/Dialog.main.js.map +1 -1
  73. package/dist/Dialog.mjs +3 -2
  74. package/dist/Dialog.module.js +3 -2
  75. package/dist/Dialog.module.js.map +1 -1
  76. package/dist/Disclosure.main.js +3 -3
  77. package/dist/Disclosure.main.js.map +1 -1
  78. package/dist/Disclosure.mjs +4 -4
  79. package/dist/Disclosure.module.js +4 -4
  80. package/dist/Disclosure.module.js.map +1 -1
  81. package/dist/DropZone.main.js +2 -3
  82. package/dist/DropZone.main.js.map +1 -1
  83. package/dist/DropZone.mjs +4 -5
  84. package/dist/DropZone.module.js +4 -5
  85. package/dist/DropZone.module.js.map +1 -1
  86. package/dist/Form.main.js +1 -1
  87. package/dist/Form.main.js.map +1 -1
  88. package/dist/Form.mjs +2 -2
  89. package/dist/Form.module.js +2 -2
  90. package/dist/Form.module.js.map +1 -1
  91. package/dist/GridList.main.js +16 -13
  92. package/dist/GridList.main.js.map +1 -1
  93. package/dist/GridList.mjs +17 -14
  94. package/dist/GridList.module.js +17 -14
  95. package/dist/GridList.module.js.map +1 -1
  96. package/dist/Group.main.js +1 -1
  97. package/dist/Group.main.js.map +1 -1
  98. package/dist/Group.mjs +2 -2
  99. package/dist/Group.module.js +2 -2
  100. package/dist/Group.module.js.map +1 -1
  101. package/dist/Header.main.js +1 -1
  102. package/dist/Header.main.js.map +1 -1
  103. package/dist/Header.mjs +2 -2
  104. package/dist/Header.module.js +2 -2
  105. package/dist/Header.module.js.map +1 -1
  106. package/dist/Heading.main.js +2 -2
  107. package/dist/Heading.main.js.map +1 -1
  108. package/dist/Heading.mjs +2 -2
  109. package/dist/Heading.module.js +2 -2
  110. package/dist/Heading.module.js.map +1 -1
  111. package/dist/HiddenDateInput.main.js +5 -1
  112. package/dist/HiddenDateInput.main.js.map +1 -1
  113. package/dist/HiddenDateInput.mjs +6 -2
  114. package/dist/HiddenDateInput.module.js +6 -2
  115. package/dist/HiddenDateInput.module.js.map +1 -1
  116. package/dist/Input.main.js +1 -1
  117. package/dist/Input.main.js.map +1 -1
  118. package/dist/Input.mjs +2 -2
  119. package/dist/Input.module.js +2 -2
  120. package/dist/Input.module.js.map +1 -1
  121. package/dist/Keyboard.main.js +1 -1
  122. package/dist/Keyboard.main.js.map +1 -1
  123. package/dist/Keyboard.mjs +2 -2
  124. package/dist/Keyboard.module.js +2 -2
  125. package/dist/Keyboard.module.js.map +1 -1
  126. package/dist/Label.main.js +2 -1
  127. package/dist/Label.main.js.map +1 -1
  128. package/dist/Label.mjs +3 -2
  129. package/dist/Label.module.js +3 -2
  130. package/dist/Label.module.js.map +1 -1
  131. package/dist/Link.main.js +3 -2
  132. package/dist/Link.main.js.map +1 -1
  133. package/dist/Link.mjs +4 -3
  134. package/dist/Link.module.js +4 -3
  135. package/dist/Link.module.js.map +1 -1
  136. package/dist/ListBox.main.js +13 -14
  137. package/dist/ListBox.main.js.map +1 -1
  138. package/dist/ListBox.mjs +14 -15
  139. package/dist/ListBox.module.js +14 -15
  140. package/dist/ListBox.module.js.map +1 -1
  141. package/dist/Menu.main.js +21 -8
  142. package/dist/Menu.main.js.map +1 -1
  143. package/dist/Menu.mjs +22 -9
  144. package/dist/Menu.module.js +22 -9
  145. package/dist/Menu.module.js.map +1 -1
  146. package/dist/Meter.main.js +1 -1
  147. package/dist/Meter.main.js.map +1 -1
  148. package/dist/Meter.mjs +2 -2
  149. package/dist/Meter.module.js +2 -2
  150. package/dist/Meter.module.js.map +1 -1
  151. package/dist/Modal.main.js +2 -2
  152. package/dist/Modal.main.js.map +1 -1
  153. package/dist/Modal.mjs +3 -3
  154. package/dist/Modal.module.js +3 -3
  155. package/dist/Modal.module.js.map +1 -1
  156. package/dist/NumberField.main.js +1 -1
  157. package/dist/NumberField.main.js.map +1 -1
  158. package/dist/NumberField.mjs +2 -2
  159. package/dist/NumberField.module.js +2 -2
  160. package/dist/NumberField.module.js.map +1 -1
  161. package/dist/OverlayArrow.main.js +1 -1
  162. package/dist/OverlayArrow.main.js.map +1 -1
  163. package/dist/OverlayArrow.mjs +2 -2
  164. package/dist/OverlayArrow.module.js +2 -2
  165. package/dist/OverlayArrow.module.js.map +1 -1
  166. package/dist/Popover.main.js +2 -2
  167. package/dist/Popover.main.js.map +1 -1
  168. package/dist/Popover.mjs +4 -4
  169. package/dist/Popover.module.js +4 -4
  170. package/dist/Popover.module.js.map +1 -1
  171. package/dist/ProgressBar.main.js +1 -1
  172. package/dist/ProgressBar.main.js.map +1 -1
  173. package/dist/ProgressBar.mjs +2 -2
  174. package/dist/ProgressBar.module.js +2 -2
  175. package/dist/ProgressBar.module.js.map +1 -1
  176. package/dist/RadioGroup.main.js +2 -2
  177. package/dist/RadioGroup.main.js.map +1 -1
  178. package/dist/RadioGroup.mjs +3 -3
  179. package/dist/RadioGroup.module.js +3 -3
  180. package/dist/RadioGroup.module.js.map +1 -1
  181. package/dist/SearchField.main.js +1 -1
  182. package/dist/SearchField.main.js.map +1 -1
  183. package/dist/SearchField.mjs +2 -2
  184. package/dist/SearchField.module.js +2 -2
  185. package/dist/SearchField.module.js.map +1 -1
  186. package/dist/Select.main.js +2 -2
  187. package/dist/Select.main.js.map +1 -1
  188. package/dist/Select.mjs +3 -3
  189. package/dist/Select.module.js +3 -3
  190. package/dist/Select.module.js.map +1 -1
  191. package/dist/Separator.main.js +3 -1
  192. package/dist/Separator.main.js.map +1 -1
  193. package/dist/Separator.mjs +4 -2
  194. package/dist/Separator.module.js +4 -2
  195. package/dist/Separator.module.js.map +1 -1
  196. package/dist/SharedElementTransition.main.js +3 -2
  197. package/dist/SharedElementTransition.main.js.map +1 -1
  198. package/dist/SharedElementTransition.mjs +4 -3
  199. package/dist/SharedElementTransition.module.js +4 -3
  200. package/dist/SharedElementTransition.module.js.map +1 -1
  201. package/dist/Slider.main.js +6 -5
  202. package/dist/Slider.main.js.map +1 -1
  203. package/dist/Slider.mjs +7 -6
  204. package/dist/Slider.module.js +7 -6
  205. package/dist/Slider.module.js.map +1 -1
  206. package/dist/Switch.main.js +1 -1
  207. package/dist/Switch.main.js.map +1 -1
  208. package/dist/Switch.mjs +2 -2
  209. package/dist/Switch.module.js +2 -2
  210. package/dist/Switch.module.js.map +1 -1
  211. package/dist/Table.main.js +30 -25
  212. package/dist/Table.main.js.map +1 -1
  213. package/dist/Table.mjs +31 -26
  214. package/dist/Table.module.js +31 -26
  215. package/dist/Table.module.js.map +1 -1
  216. package/dist/Tabs.main.js +13 -6
  217. package/dist/Tabs.main.js.map +1 -1
  218. package/dist/Tabs.mjs +14 -7
  219. package/dist/Tabs.module.js +14 -7
  220. package/dist/Tabs.module.js.map +1 -1
  221. package/dist/TagGroup.main.js +6 -5
  222. package/dist/TagGroup.main.js.map +1 -1
  223. package/dist/TagGroup.mjs +7 -6
  224. package/dist/TagGroup.module.js +7 -6
  225. package/dist/TagGroup.module.js.map +1 -1
  226. package/dist/Text.main.js +2 -1
  227. package/dist/Text.main.js.map +1 -1
  228. package/dist/Text.mjs +3 -2
  229. package/dist/Text.module.js +3 -2
  230. package/dist/Text.module.js.map +1 -1
  231. package/dist/TextArea.main.js +1 -1
  232. package/dist/TextArea.main.js.map +1 -1
  233. package/dist/TextArea.mjs +2 -2
  234. package/dist/TextArea.module.js +2 -2
  235. package/dist/TextArea.module.js.map +1 -1
  236. package/dist/TextField.main.js +1 -1
  237. package/dist/TextField.main.js.map +1 -1
  238. package/dist/TextField.mjs +2 -2
  239. package/dist/TextField.module.js +2 -2
  240. package/dist/TextField.module.js.map +1 -1
  241. package/dist/Toast.main.js +6 -4
  242. package/dist/Toast.main.js.map +1 -1
  243. package/dist/Toast.mjs +7 -5
  244. package/dist/Toast.module.js +7 -5
  245. package/dist/Toast.module.js.map +1 -1
  246. package/dist/ToggleButton.main.js +5 -2
  247. package/dist/ToggleButton.main.js.map +1 -1
  248. package/dist/ToggleButton.mjs +6 -3
  249. package/dist/ToggleButton.module.js +6 -3
  250. package/dist/ToggleButton.module.js.map +1 -1
  251. package/dist/ToggleButtonGroup.main.js +1 -1
  252. package/dist/ToggleButtonGroup.main.js.map +1 -1
  253. package/dist/ToggleButtonGroup.mjs +2 -2
  254. package/dist/ToggleButtonGroup.module.js +2 -2
  255. package/dist/ToggleButtonGroup.module.js.map +1 -1
  256. package/dist/Toolbar.main.js +1 -1
  257. package/dist/Toolbar.main.js.map +1 -1
  258. package/dist/Toolbar.mjs +2 -2
  259. package/dist/Toolbar.module.js +2 -2
  260. package/dist/Toolbar.module.js.map +1 -1
  261. package/dist/Tooltip.main.js +1 -1
  262. package/dist/Tooltip.main.js.map +1 -1
  263. package/dist/Tooltip.mjs +2 -2
  264. package/dist/Tooltip.module.js +2 -2
  265. package/dist/Tooltip.module.js.map +1 -1
  266. package/dist/Tree.main.js +6 -6
  267. package/dist/Tree.main.js.map +1 -1
  268. package/dist/Tree.mjs +7 -7
  269. package/dist/Tree.module.js +7 -7
  270. package/dist/Tree.module.js.map +1 -1
  271. package/dist/types.d.ts +122 -63
  272. package/dist/types.d.ts.map +1 -1
  273. package/dist/utils.main.js +41 -3
  274. package/dist/utils.main.js.map +1 -1
  275. package/dist/utils.mjs +42 -5
  276. package/dist/utils.module.js +42 -5
  277. package/dist/utils.module.js.map +1 -1
  278. package/package.json +24 -24
  279. package/src/Breadcrumbs.tsx +9 -6
  280. package/src/Button.tsx +4 -3
  281. package/src/Calendar.tsx +26 -20
  282. package/src/Checkbox.tsx +7 -6
  283. package/src/ColorArea.tsx +3 -2
  284. package/src/ColorField.tsx +18 -3
  285. package/src/ColorSlider.tsx +2 -1
  286. package/src/ColorSwatch.tsx +2 -1
  287. package/src/ColorSwatchPicker.tsx +2 -0
  288. package/src/ColorThumb.tsx +3 -3
  289. package/src/ColorWheel.tsx +4 -3
  290. package/src/ComboBox.tsx +3 -2
  291. package/src/DateField.tsx +5 -4
  292. package/src/DatePicker.tsx +3 -2
  293. package/src/Dialog.tsx +5 -4
  294. package/src/Disclosure.tsx +7 -6
  295. package/src/DropZone.tsx +5 -5
  296. package/src/Form.tsx +4 -4
  297. package/src/GridList.tsx +30 -23
  298. package/src/Group.tsx +10 -9
  299. package/src/Header.tsx +7 -5
  300. package/src/Heading.tsx +4 -4
  301. package/src/HiddenDateInput.tsx +10 -3
  302. package/src/Input.tsx +3 -2
  303. package/src/Keyboard.tsx +4 -2
  304. package/src/Label.tsx +4 -3
  305. package/src/Link.tsx +15 -12
  306. package/src/ListBox.tsx +23 -22
  307. package/src/Menu.tsx +32 -17
  308. package/src/Meter.tsx +3 -2
  309. package/src/Modal.tsx +5 -4
  310. package/src/NumberField.tsx +2 -1
  311. package/src/OverlayArrow.tsx +3 -2
  312. package/src/Popover.tsx +5 -4
  313. package/src/ProgressBar.tsx +3 -2
  314. package/src/RadioGroup.tsx +6 -5
  315. package/src/SearchField.tsx +3 -2
  316. package/src/Select.tsx +6 -5
  317. package/src/Separator.tsx +8 -5
  318. package/src/SharedElementTransition.tsx +4 -3
  319. package/src/Slider.tsx +9 -7
  320. package/src/Switch.tsx +11 -10
  321. package/src/Table.tsx +47 -36
  322. package/src/Tabs.tsx +23 -18
  323. package/src/TagGroup.tsx +16 -13
  324. package/src/Text.tsx +4 -3
  325. package/src/TextArea.tsx +3 -2
  326. package/src/TextField.tsx +4 -3
  327. package/src/Toast.tsx +15 -11
  328. package/src/ToggleButton.tsx +5 -4
  329. package/src/ToggleButtonGroup.tsx +3 -2
  330. package/src/Toolbar.tsx +3 -2
  331. package/src/Tooltip.tsx +3 -2
  332. package/src/Tree.tsx +18 -17
  333. package/src/utils.tsx +97 -11
package/src/Toast.tsx CHANGED
@@ -16,6 +16,8 @@ import {
16
16
  ClassNameOrFunction,
17
17
  ContextValue,
18
18
  DEFAULT_SLOT,
19
+ dom,
20
+ DOMRenderProps,
19
21
  Provider,
20
22
  RenderProps,
21
23
  StyleRenderProps,
@@ -102,15 +104,15 @@ export const ToastRegion = /*#__PURE__*/ (forwardRef as forwardRefType)(function
102
104
 
103
105
  let region = (
104
106
  <ToastStateContext.Provider value={state}>
105
- <div
107
+ <dom.div
106
108
  {...mergeProps(DOMProps, renderProps, regionProps, focusProps, hoverProps)}
107
109
  dir={direction}
108
110
  ref={objectRef}
109
111
  data-hovered={isHovered || undefined}
110
112
  data-focused={isFocused || undefined}
111
113
  data-focus-visible={isFocusVisible || undefined}>
112
- {typeof props.children === 'function' ? <ToastList {...props} className={undefined} style={{display: 'contents'}}>{props.children}</ToastList> : props.children}
113
- </div>
114
+ {typeof props.children === 'function' ? <ToastList {...props} render={undefined} className={undefined} style={{display: 'contents'}}>{props.children}</ToastList> : props.children}
115
+ </dom.div>
114
116
  </ToastStateContext.Provider>
115
117
  );
116
118
 
@@ -119,7 +121,7 @@ export const ToastRegion = /*#__PURE__*/ (forwardRef as forwardRefType)(function
119
121
  : null;
120
122
  });
121
123
 
122
- export interface ToastListProps<T> extends Omit<ToastRegionProps<T>, 'queue' | 'children'> {
124
+ export interface ToastListProps<T> extends Omit<ToastRegionProps<T>, 'queue' | 'children' | 'render'>, DOMRenderProps<'ol', ToastRegionRenderProps<T>> {
123
125
  /** A function to render each toast. */
124
126
  children: (renderProps: {toast: QueuedToast<T>}) => ReactElement
125
127
  }
@@ -140,13 +142,13 @@ export const ToastList = /*#__PURE__*/ (forwardRef as forwardRefType)(function T
140
142
  });
141
143
 
142
144
  return (
143
- <ol {...hoverProps} {...renderProps} ref={ref}>
145
+ <dom.ol {...hoverProps} {...renderProps} ref={ref}>
144
146
  {state.visibleToasts.map((toast) => (
145
147
  <li key={toast.key} style={{display: 'contents'}}>
146
148
  {props.children({toast})}
147
149
  </li>
148
150
  ))}
149
- </ol>
151
+ </dom.ol>
150
152
  );
151
153
  });
152
154
 
@@ -201,7 +203,7 @@ export const Toast = /*#__PURE__*/ (forwardRef as forwardRefType)(function Toast
201
203
  let DOMProps = filterDOMProps(props, {global: true});
202
204
 
203
205
  return (
204
- <div
206
+ <dom.div
205
207
  {...mergeProps(DOMProps, renderProps, toastProps, focusProps)}
206
208
  ref={objectRef}
207
209
  data-focused={isFocused || undefined}
@@ -225,20 +227,22 @@ export const Toast = /*#__PURE__*/ (forwardRef as forwardRefType)(function Toast
225
227
  ]}>
226
228
  {renderProps.children}
227
229
  </Provider>
228
- </div>
230
+ </dom.div>
229
231
  );
230
232
  });
231
233
 
234
+ export interface ToastContentProps extends HTMLAttributes<HTMLElement>, DOMRenderProps<'div', undefined> {}
235
+
232
236
  export const ToastContentContext = createContext<ContextValue<HTMLAttributes<HTMLElement>, HTMLDivElement>>({});
233
237
 
234
238
  /**
235
239
  * ToastContent wraps the main content of a toast notification.
236
240
  */
237
- export const ToastContent = /*#__PURE__*/ forwardRef(function ToastContent(props: HTMLAttributes<HTMLElement>, ref: ForwardedRef<HTMLDivElement>) {
241
+ export const ToastContent = /*#__PURE__*/ forwardRef(function ToastContent(props: ToastContentProps, ref: ForwardedRef<HTMLDivElement>) {
238
242
  [props, ref] = useContextProps(props, ref, ToastContentContext);
239
243
  return (
240
- <div className="react-aria-ToastContent" {...props} ref={ref}>
244
+ <dom.div render={props.render} className="react-aria-ToastContent" {...props} ref={ref}>
241
245
  {props.children}
242
- </div>
246
+ </dom.div>
243
247
  );
244
248
  });
@@ -15,6 +15,7 @@ import {ButtonRenderProps} from './Button';
15
15
  import {
16
16
  ClassNameOrFunction,
17
17
  ContextValue,
18
+ dom,
18
19
  RenderProps,
19
20
  SlotProps,
20
21
  useContextProps,
@@ -39,7 +40,7 @@ export interface ToggleButtonRenderProps extends Omit<ButtonRenderProps, 'isPend
39
40
  state: ToggleState
40
41
  }
41
42
 
42
- export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
43
+ export interface ToggleButtonProps extends Omit<AriaToggleButtonProps, 'children' | 'elementType' | 'id'>, HoverEvents, SlotProps, RenderProps<ToggleButtonRenderProps, 'button'>, Omit<GlobalDOMAttributes<HTMLDivElement>, 'onClick'> {
43
44
  /**
44
45
  * 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.
45
46
  * @default 'react-aria-ToggleButton'
@@ -71,7 +72,7 @@ export const ToggleButton = /*#__PURE__*/ (forwardRef as forwardRefType)(functio
71
72
  : useToggleButton({...props, id: props.id != null ? String(props.id) : undefined}, state, ref);
72
73
 
73
74
  let {focusProps, isFocused, isFocusVisible} = useFocusRing(props);
74
- let {hoverProps, isHovered} = useHover(props);
75
+ let {hoverProps, isHovered} = useHover({...props, isDisabled});
75
76
  let renderProps = useRenderProps({
76
77
  ...props,
77
78
  id: undefined,
@@ -84,7 +85,7 @@ export const ToggleButton = /*#__PURE__*/ (forwardRef as forwardRefType)(functio
84
85
  delete DOMProps.onClick;
85
86
 
86
87
  return (
87
- <button
88
+ <dom.button
88
89
  {...mergeProps(DOMProps, renderProps, buttonProps, focusProps, hoverProps)}
89
90
  ref={ref}
90
91
  slot={props.slot || undefined}
@@ -97,6 +98,6 @@ export const ToggleButton = /*#__PURE__*/ (forwardRef as forwardRefType)(functio
97
98
  <SelectionIndicatorContext.Provider value={{isSelected}}>
98
99
  {renderProps.children}
99
100
  </SelectionIndicatorContext.Provider>
100
- </button>
101
+ </dom.button>
101
102
  );
102
103
  });
@@ -13,6 +13,7 @@ import {AriaToggleButtonGroupProps, useToggleButtonGroup} from 'react-aria';
13
13
  import {
14
14
  ClassNameOrFunction,
15
15
  ContextValue,
16
+ dom,
16
17
  RenderProps,
17
18
  SlotProps,
18
19
  useContextProps,
@@ -73,7 +74,7 @@ export const ToggleButtonGroup = /*#__PURE__*/ (forwardRef as forwardRefType)(fu
73
74
  let DOMProps = filterDOMProps(props, {global: true});
74
75
 
75
76
  return (
76
- <div
77
+ <dom.div
77
78
  {...mergeProps(DOMProps, renderProps, groupProps)}
78
79
  ref={ref}
79
80
  slot={props.slot || undefined}
@@ -84,6 +85,6 @@ export const ToggleButtonGroup = /*#__PURE__*/ (forwardRef as forwardRefType)(fu
84
85
  {renderProps.children}
85
86
  </SharedElementTransition>
86
87
  </ToggleGroupStateContext.Provider>
87
- </div>
88
+ </dom.div>
88
89
  );
89
90
  });
package/src/Toolbar.tsx CHANGED
@@ -14,6 +14,7 @@ import {AriaToolbarProps, useToolbar} from '@react-aria/toolbar';
14
14
  import {
15
15
  ClassNameOrFunction,
16
16
  ContextValue,
17
+ dom,
17
18
  RenderProps,
18
19
  SlotProps,
19
20
  useContextProps,
@@ -57,12 +58,12 @@ export const Toolbar = /*#__PURE__*/ (forwardRef as forwardRefType)(function Too
57
58
  delete DOMProps.id;
58
59
 
59
60
  return (
60
- <div
61
+ <dom.div
61
62
  {...mergeProps(DOMProps, renderProps, toolbarProps)}
62
63
  ref={ref}
63
64
  slot={props.slot || undefined}
64
65
  data-orientation={props.orientation || 'horizontal'}>
65
66
  {renderProps.children}
66
- </div>
67
+ </dom.div>
67
68
  );
68
69
  });
package/src/Tooltip.tsx CHANGED
@@ -15,6 +15,7 @@ import {AriaPositionProps, mergeProps, OverlayContainer, Placement, PlacementAxi
15
15
  import {
16
16
  ClassNameOrFunction,
17
17
  ContextValue,
18
+ dom,
18
19
  Provider,
19
20
  RenderProps,
20
21
  useContextProps,
@@ -167,7 +168,7 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref
167
168
  let DOMProps = filterDOMProps(props, {global: true});
168
169
 
169
170
  return (
170
- <div
171
+ <dom.div
171
172
  {...mergeProps(DOMProps, renderProps, tooltipProps)}
172
173
  ref={props.tooltipRef}
173
174
  style={{
@@ -181,6 +182,6 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref
181
182
  <OverlayArrowContext.Provider value={{...arrowProps, placement, ref: arrowRef}}>
182
183
  {renderProps.children}
183
184
  </OverlayArrowContext.Provider>
184
- </div>
185
+ </dom.div>
185
186
  );
186
187
  }
package/src/Tree.tsx CHANGED
@@ -18,6 +18,7 @@ import {
18
18
  ClassNameOrFunction,
19
19
  ContextValue,
20
20
  DEFAULT_SLOT,
21
+ dom,
21
22
  Provider,
22
23
  RenderProps,
23
24
  SlotProps,
@@ -372,8 +373,8 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
372
373
  };
373
374
 
374
375
  let renderProps = useRenderProps({
375
- className: props.className,
376
- style: props.style,
376
+ ...props,
377
+ children: undefined,
377
378
  defaultClassName: 'react-aria-Tree',
378
379
  values: renderValues
379
380
  });
@@ -401,7 +402,7 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
401
402
  return (
402
403
  <>
403
404
  <FocusScope>
404
- <div
405
+ <dom.div
405
406
  {...mergeProps(DOMProps, renderProps, gridProps, focusProps, droppableCollection?.collectionProps)}
406
407
  ref={ref}
407
408
  slot={props.slot || undefined}
@@ -427,7 +428,7 @@ function TreeInner<T extends object>({props, collection, treeRef: ref}: TreeInne
427
428
  </SharedElementTransition>
428
429
  </Provider>
429
430
  {emptyState}
430
- </div>
431
+ </dom.div>
431
432
  </FocusScope>
432
433
  {dragPreview}
433
434
  </>
@@ -673,15 +674,15 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent(TreeItemNode, <T ext
673
674
  </div>
674
675
  </div>
675
676
  )}
676
- <div
677
+ <dom.div
677
678
  {...mergeProps(
678
- DOMProps,
679
- rowProps,
680
- focusProps,
681
- hoverProps,
682
- focusWithinProps,
683
- draggableItem?.dragProps
684
- )}
679
+ DOMProps,
680
+ rowProps,
681
+ focusProps,
682
+ hoverProps,
683
+ focusWithinProps,
684
+ draggableItem?.dragProps
685
+ )}
685
686
  {...renderProps}
686
687
  ref={ref}
687
688
  // TODO: missing selectionBehavior, hasAction and allowsSelection data attribute equivalents (available in renderProps). Do we want those?
@@ -732,7 +733,7 @@ export const TreeItem = /*#__PURE__*/ createBranchComponent(TreeItemNode, <T ext
732
733
  {children}
733
734
  </Provider>
734
735
  </div>
735
- </div>
736
+ </dom.div>
736
737
  </>
737
738
  );
738
739
  });
@@ -811,7 +812,7 @@ export const TreeLoadMoreItem = createLeafComponent(LoaderNode, function TreeLoa
811
812
  <div data-testid="loadMoreSentinel" ref={sentinelRef} style={{position: 'absolute', height: 1, width: 1}} />
812
813
  </div>
813
814
  {isLoading && renderProps.children && (
814
- <div
815
+ <dom.div
815
816
  ref={ref}
816
817
  {...mergeProps(filterDOMProps(props as any), ariaProps)}
817
818
  {...renderProps}
@@ -819,7 +820,7 @@ export const TreeLoadMoreItem = createLeafComponent(LoaderNode, function TreeLoa
819
820
  <div {...gridCellProps} style={style}>
820
821
  {renderProps.children}
821
822
  </div>
822
- </div>
823
+ </dom.div>
823
824
  )}
824
825
  </>
825
826
  );
@@ -963,7 +964,7 @@ function TreeDropIndicator(props: TreeDropIndicatorProps, ref: ForwardedRef<HTML
963
964
  });
964
965
 
965
966
  return (
966
- <div
967
+ <dom.div
967
968
  {...renderProps}
968
969
  role="row"
969
970
  aria-level={level}
@@ -973,7 +974,7 @@ function TreeDropIndicator(props: TreeDropIndicatorProps, ref: ForwardedRef<HTML
973
974
  <div {...visuallyHiddenProps} role="button" {...dropIndicatorProps} ref={buttonRef} />
974
975
  {renderProps.children}
975
976
  </div>
976
- </div>
977
+ </dom.div>
977
978
  );
978
979
  }
979
980
 
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, useCallback, useContext, useMemo, useRef, useState} from 'react';
15
+ import React, {AllHTMLAttributes, AnchorHTMLAttributes, Context, CSSProperties, DetailedHTMLProps, ForwardedRef, forwardRef, JSX, ReactElement, ReactNode, RefCallback, useCallback, useContext, useMemo, useRef, useState} from 'react';
16
16
 
17
17
  export const DEFAULT_SLOT = Symbol('default');
18
18
 
@@ -20,7 +20,7 @@ interface SlottedValue<T> {
20
20
  slots?: Record<string | symbol, T>
21
21
  }
22
22
 
23
- export type SlottedContextValue<T> = SlottedValue<T> | T | null | undefined;
23
+ export type SlottedContextValue<T> = (SlottedValue<T> & T) | null | undefined;
24
24
  export type ContextValue<T, E> = SlottedContextValue<WithRef<T, E>>;
25
25
 
26
26
  type ProviderValue<T> = [Context<T>, T];
@@ -66,7 +66,7 @@ export interface DOMProps extends StyleProps, SharedDOMProps {
66
66
  export type ClassNameOrFunction<T> = string | ((values: T & {defaultClassName: string | undefined}) => string);
67
67
  type StyleOrFunction<T> = CSSProperties | ((values: T & {defaultStyle: CSSProperties}) => CSSProperties | undefined);
68
68
 
69
- export interface StyleRenderProps<T> {
69
+ export interface StyleRenderProps<T, E extends keyof React.JSX.IntrinsicElements = 'div'> extends DOMRenderProps<E, T> {
70
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. */
71
71
  className?: ClassNameOrFunction<T>,
72
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,26 +75,27 @@ export interface StyleRenderProps<T> {
75
75
 
76
76
  export type ChildrenOrFunction<T> = ReactNode | ((values: T & {defaultChildren: ReactNode | undefined}) => ReactNode);
77
77
 
78
- export interface RenderProps<T> extends StyleRenderProps<T> {
78
+ export interface RenderProps<T, E extends keyof React.JSX.IntrinsicElements = 'div'> extends StyleRenderProps<T, E> {
79
79
  /** The children of the component. A function may be provided to alter the children based on component state. */
80
80
  children?: ChildrenOrFunction<T>
81
81
  }
82
82
 
83
- interface RenderPropsHookOptions<T> extends RenderProps<T>, SharedDOMProps, AriaLabelingProps {
83
+ interface RenderPropsHookOptions<T, E extends keyof React.JSX.IntrinsicElements> extends RenderProps<T, E>, SharedDOMProps, AriaLabelingProps {
84
84
  values: T,
85
85
  defaultChildren?: ReactNode,
86
86
  defaultClassName?: string,
87
87
  defaultStyle?: CSSProperties
88
88
  }
89
89
 
90
- interface RenderPropsHookRetVal {
90
+ interface RenderPropsHookRetVal<T, E extends keyof React.JSX.IntrinsicElements> {
91
91
  className?: string,
92
92
  style?: CSSProperties,
93
93
  children?: ReactNode,
94
- 'data-rac': string
94
+ 'data-rac': string,
95
+ render?: DOMRenderFunction<E, T>
95
96
  }
96
97
 
97
- export function useRenderProps<T>(props: RenderPropsHookOptions<T>): RenderPropsHookRetVal {
98
+ export function useRenderProps<T, E extends keyof React.JSX.IntrinsicElements>(props: RenderPropsHookOptions<T, E>): RenderPropsHookRetVal<T, E> {
98
99
  let {
99
100
  className,
100
101
  style,
@@ -102,7 +103,8 @@ export function useRenderProps<T>(props: RenderPropsHookOptions<T>): RenderProps
102
103
  defaultClassName = undefined,
103
104
  defaultChildren = undefined,
104
105
  defaultStyle,
105
- values
106
+ values,
107
+ render
106
108
  } = props;
107
109
 
108
110
  return useMemo(() => {
@@ -134,9 +136,10 @@ export function useRenderProps<T>(props: RenderPropsHookOptions<T>): RenderProps
134
136
  className: computedClassName ?? defaultClassName,
135
137
  style: (computedStyle || defaultStyle) ? {...defaultStyle, ...computedStyle} : undefined,
136
138
  children: computedChildren ?? defaultChildren,
137
- 'data-rac': ''
139
+ 'data-rac': '',
140
+ render: render ? (props => render(props, values)) : undefined
138
141
  };
139
- }, [className, style, children, defaultClassName, defaultChildren, defaultStyle, values]);
142
+ }, [className, style, children, defaultClassName, defaultChildren, defaultStyle, values, render]);
140
143
  }
141
144
 
142
145
  /**
@@ -262,3 +265,86 @@ export interface RACValidation {
262
265
  */
263
266
  validationBehavior?: 'native' | 'aria'
264
267
  }
268
+
269
+ export type DOMRenderFunction<E extends keyof React.JSX.IntrinsicElements, T> = (props: React.JSX.IntrinsicElements[E], renderProps: T) => ReactElement;
270
+ export interface DOMRenderProps<E extends keyof React.JSX.IntrinsicElements, T> {
271
+ /**
272
+ * Overrides the default DOM element with a custom render function.
273
+ * This allows rendering existing components with built-in styles and behaviors
274
+ * such as router links, animation libraries, and pre-styled components.
275
+ *
276
+ * Requirements:
277
+ *
278
+ * * You must render the expected element type (e.g. if `<button>` is expected, you cannot render an `<a>`).
279
+ * * Only a single root DOM element can be rendered (no fragments).
280
+ * * You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.
281
+ */
282
+ render?: DOMRenderFunction<E, T>
283
+ }
284
+
285
+ // Makes `href` required in AnchorHTMLAttributes
286
+ type LinkWithRequiredHref = Required<Pick<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>> & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>;
287
+
288
+ // Same as DOMRenderProps but specific for the case where the element could be a 'a' or 'div' element.
289
+ export interface PossibleLinkDOMRenderProps<Fallback extends keyof React.JSX.IntrinsicElements, T> {
290
+ /**
291
+ * Overrides the default DOM element with a custom render function.
292
+ * This allows rendering existing components with built-in styles and behaviors
293
+ * such as router links, animation libraries, and pre-styled components.
294
+ *
295
+ * Note: You can check if `'href' in props` in order to tell whether to render an `<a>` element.
296
+ *
297
+ * Requirements:
298
+ *
299
+ * * You must render the expected element type (e.g. if `<a>` is expected, you cannot render a `<button>`).
300
+ * * Only a single root DOM element can be rendered (no fragments).
301
+ * * You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.
302
+ */
303
+ render?: (props: DetailedHTMLProps<LinkWithRequiredHref, HTMLAnchorElement> | React.JSX.IntrinsicElements[Fallback], renderProps: T) => ReactElement
304
+ }
305
+
306
+ function DOMElement(ElementType: string, props: DOMRenderProps<any, any> & AllHTMLAttributes<HTMLElement>, forwardedRef: ForwardedRef<HTMLElement>) {
307
+ let {render, ...otherProps} = props;
308
+ let elementRef = useRef<HTMLElement | null>(null);
309
+ let ref = useMemo(() => mergeRefs(forwardedRef, elementRef), [forwardedRef, elementRef]);
310
+
311
+ useLayoutEffect(() => {
312
+ if (process.env.NODE_ENV !== 'production' && render) {
313
+ if (!elementRef.current) {
314
+ console.warn('Ref was not connected to DOM element returned by custom `render` function. Did you forget to pass through or merge the `ref`?');
315
+ } else if (elementRef.current.localName !== ElementType) {
316
+ console.warn(`Unexpected DOM element returned by custom \`render\` function. Expected <${ElementType}>, got <${elementRef.current.localName}>. This may break the component behavior and accessibility.`);
317
+ }
318
+ }
319
+ }, [ElementType, render]);
320
+
321
+ let domProps: any = {...otherProps, ref};
322
+ if (render) {
323
+ return render(domProps, undefined);
324
+ }
325
+
326
+ return <ElementType {...domProps} />;
327
+ }
328
+
329
+ type DOMComponents = {
330
+ [E in keyof React.JSX.IntrinsicElements]: (props: DOMRenderProps<E, any> & React.JSX.IntrinsicElements[E]) => ReactElement
331
+ };
332
+
333
+ const domComponentCache = {};
334
+
335
+ // Dynamically generates and caches components for each DOM element (e.g. `dom.button`).
336
+ export const dom = new Proxy({}, {
337
+ get(target, elementType) {
338
+ if (typeof elementType !== 'string') {
339
+ return undefined;
340
+ }
341
+
342
+ let res = domComponentCache[elementType];
343
+ if (!res) {
344
+ res = forwardRef(DOMElement.bind(null, elementType));
345
+ domComponentCache[elementType] = res;
346
+ }
347
+
348
+ return res;
349
+ }
350
+ }) as DOMComponents;