@graphprotocol/gds-react 0.1.2 → 0.2.1

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 (433) hide show
  1. package/dist/GDSContext.d.ts +13 -0
  2. package/dist/GDSContext.d.ts.map +1 -0
  3. package/dist/GDSContext.js +4 -0
  4. package/dist/GDSContext.js.map +1 -0
  5. package/dist/GDSProvider.d.ts +13 -19
  6. package/dist/GDSProvider.d.ts.map +1 -1
  7. package/dist/GDSProvider.js +14 -11
  8. package/dist/GDSProvider.js.map +1 -1
  9. package/dist/components/Address.js +2 -2
  10. package/dist/components/Address.meta.d.ts +1 -13
  11. package/dist/components/Address.meta.d.ts.map +1 -1
  12. package/dist/components/Avatar.d.ts.map +1 -1
  13. package/dist/components/Avatar.js +3 -11
  14. package/dist/components/Avatar.js.map +1 -1
  15. package/dist/components/Avatar.meta.d.ts +0 -2
  16. package/dist/components/Avatar.meta.d.ts.map +1 -1
  17. package/dist/components/AvatarGroup.meta.d.ts +8 -2
  18. package/dist/components/AvatarGroup.meta.d.ts.map +1 -1
  19. package/dist/components/Breadcrumbs.meta.d.ts +2 -3
  20. package/dist/components/Breadcrumbs.meta.d.ts.map +1 -1
  21. package/dist/components/Breadcrumbs.meta.js +3 -1
  22. package/dist/components/Breadcrumbs.meta.js.map +1 -1
  23. package/dist/components/Breadcrumbs.parts.d.ts.map +1 -1
  24. package/dist/components/Breadcrumbs.parts.js +13 -21
  25. package/dist/components/Breadcrumbs.parts.js.map +1 -1
  26. package/dist/components/Button.d.ts.map +1 -1
  27. package/dist/components/Button.js +70 -69
  28. package/dist/components/Button.js.map +1 -1
  29. package/dist/components/Button.meta.d.ts +1 -4
  30. package/dist/components/Button.meta.d.ts.map +1 -1
  31. package/dist/components/ButtonGroup.d.ts.map +1 -1
  32. package/dist/components/ButtonGroup.js +1 -5
  33. package/dist/components/ButtonGroup.js.map +1 -1
  34. package/dist/components/ButtonGroup.meta.d.ts +1 -5
  35. package/dist/components/ButtonGroup.meta.d.ts.map +1 -1
  36. package/dist/components/ButtonGroup.meta.js +8 -0
  37. package/dist/components/ButtonGroup.meta.js.map +1 -1
  38. package/dist/components/Card.js +2 -2
  39. package/dist/components/Card.js.map +1 -1
  40. package/dist/components/Card.meta.d.ts +1 -2
  41. package/dist/components/Card.meta.d.ts.map +1 -1
  42. package/dist/components/Card.meta.js +1 -0
  43. package/dist/components/Card.meta.js.map +1 -1
  44. package/dist/components/Checkbox.meta.d.ts +1 -6
  45. package/dist/components/Checkbox.meta.d.ts.map +1 -1
  46. package/dist/components/Checkbox.meta.js +1 -5
  47. package/dist/components/Checkbox.meta.js.map +1 -1
  48. package/dist/components/Chip.meta.d.ts +2 -4
  49. package/dist/components/Chip.meta.d.ts.map +1 -1
  50. package/dist/components/Chip.parts.d.ts.map +1 -1
  51. package/dist/components/Chip.parts.js +1 -9
  52. package/dist/components/Chip.parts.js.map +1 -1
  53. package/dist/components/Cluster.meta.d.ts +8 -2
  54. package/dist/components/Cluster.meta.d.ts.map +1 -1
  55. package/dist/components/CodeBlock.d.ts +1 -1
  56. package/dist/components/CodeBlock.meta.d.ts +2 -4
  57. package/dist/components/CodeBlock.meta.d.ts.map +1 -1
  58. package/dist/components/CodeBlock.parts.d.ts +6 -7
  59. package/dist/components/CodeBlock.parts.d.ts.map +1 -1
  60. package/dist/components/CodeBlock.parts.js +28 -10
  61. package/dist/components/CodeBlock.parts.js.map +1 -1
  62. package/dist/components/CodeInline.js +3 -3
  63. package/dist/components/CodeInline.meta.d.ts +1 -1
  64. package/dist/components/CodeInline.meta.d.ts.map +1 -1
  65. package/dist/components/CopyButton.d.ts +1 -1
  66. package/dist/components/CopyButton.d.ts.map +1 -1
  67. package/dist/components/CopyButton.js +46 -21
  68. package/dist/components/CopyButton.js.map +1 -1
  69. package/dist/components/CopyButton.meta.d.ts +1 -12
  70. package/dist/components/CopyButton.meta.d.ts.map +1 -1
  71. package/dist/components/CopyButton.meta.js +1 -6
  72. package/dist/components/CopyButton.meta.js.map +1 -1
  73. package/dist/components/CurrencyInput.meta.d.ts +1 -6
  74. package/dist/components/CurrencyInput.meta.d.ts.map +1 -1
  75. package/dist/components/CurrencyInput.meta.js +1 -5
  76. package/dist/components/CurrencyInput.meta.js.map +1 -1
  77. package/dist/components/DescriptionList.meta.d.ts +2 -5
  78. package/dist/components/DescriptionList.meta.d.ts.map +1 -1
  79. package/dist/components/DescriptionList.parts.d.ts +3 -0
  80. package/dist/components/DescriptionList.parts.d.ts.map +1 -1
  81. package/dist/components/DescriptionList.parts.js +1 -0
  82. package/dist/components/DescriptionList.parts.js.map +1 -1
  83. package/dist/components/Divider.meta.d.ts +1 -3
  84. package/dist/components/Divider.meta.d.ts.map +1 -1
  85. package/dist/components/Icon.js +4 -4
  86. package/dist/components/Icon.js.map +1 -1
  87. package/dist/components/Icon.meta.d.ts +0 -2
  88. package/dist/components/Icon.meta.d.ts.map +1 -1
  89. package/dist/components/Icon.meta.js +1 -0
  90. package/dist/components/Icon.meta.js.map +1 -1
  91. package/dist/components/Input.d.ts +5 -4
  92. package/dist/components/Input.d.ts.map +1 -1
  93. package/dist/components/Input.js +3 -2
  94. package/dist/components/Input.js.map +1 -1
  95. package/dist/components/Input.meta.d.ts +1 -6
  96. package/dist/components/Input.meta.d.ts.map +1 -1
  97. package/dist/components/Input.meta.js +1 -5
  98. package/dist/components/Input.meta.js.map +1 -1
  99. package/dist/components/Keyboard.js +1 -1
  100. package/dist/components/Keyboard.meta.d.ts +0 -1
  101. package/dist/components/Keyboard.meta.d.ts.map +1 -1
  102. package/dist/components/Label.meta.d.ts +1 -3
  103. package/dist/components/Label.meta.d.ts.map +1 -1
  104. package/dist/components/Link.d.ts +1 -1
  105. package/dist/components/Link.d.ts.map +1 -1
  106. package/dist/components/Link.js +3 -4
  107. package/dist/components/Link.js.map +1 -1
  108. package/dist/components/Link.meta.d.ts +1 -2
  109. package/dist/components/Link.meta.d.ts.map +1 -1
  110. package/dist/components/Link.meta.js +1 -0
  111. package/dist/components/Link.meta.js.map +1 -1
  112. package/dist/components/Menu.meta.d.ts +31 -2
  113. package/dist/components/Menu.meta.d.ts.map +1 -1
  114. package/dist/components/Menu.meta.js +39 -1
  115. package/dist/components/Menu.meta.js.map +1 -1
  116. package/dist/components/Menu.parts.d.ts +22 -32
  117. package/dist/components/Menu.parts.d.ts.map +1 -1
  118. package/dist/components/Menu.parts.js +286 -300
  119. package/dist/components/Menu.parts.js.map +1 -1
  120. package/dist/components/Modal.d.ts +1 -1
  121. package/dist/components/Modal.meta.d.ts +1 -3
  122. package/dist/components/Modal.meta.d.ts.map +1 -1
  123. package/dist/components/Modal.meta.js +1 -1
  124. package/dist/components/Modal.meta.js.map +1 -1
  125. package/dist/components/Modal.parts.d.ts +14 -15
  126. package/dist/components/Modal.parts.d.ts.map +1 -1
  127. package/dist/components/Modal.parts.js +20 -20
  128. package/dist/components/Modal.parts.js.map +1 -1
  129. package/dist/components/OTCInput.js +1 -1
  130. package/dist/components/OTCInput.meta.d.ts +1 -6
  131. package/dist/components/OTCInput.meta.d.ts.map +1 -1
  132. package/dist/components/OTCInput.meta.js +1 -5
  133. package/dist/components/OTCInput.meta.js.map +1 -1
  134. package/dist/components/Pane.d.ts +9 -0
  135. package/dist/components/Pane.d.ts.map +1 -0
  136. package/dist/components/Pane.js +8 -0
  137. package/dist/components/Pane.js.map +1 -0
  138. package/dist/components/Pane.meta.d.ts +20 -0
  139. package/dist/components/Pane.meta.d.ts.map +1 -0
  140. package/dist/components/Pane.meta.js +30 -0
  141. package/dist/components/Pane.meta.js.map +1 -0
  142. package/dist/components/Pane.parts.d.ts +77 -0
  143. package/dist/components/Pane.parts.d.ts.map +1 -0
  144. package/dist/components/Pane.parts.js +412 -0
  145. package/dist/components/Pane.parts.js.map +1 -0
  146. package/dist/components/Radio.meta.d.ts +1 -6
  147. package/dist/components/Radio.meta.d.ts.map +1 -1
  148. package/dist/components/Radio.meta.js +1 -5
  149. package/dist/components/Radio.meta.js.map +1 -1
  150. package/dist/components/Search.js +1 -1
  151. package/dist/components/Search.meta.d.ts +1 -3
  152. package/dist/components/Search.meta.d.ts.map +1 -1
  153. package/dist/components/SegmentedControl.meta.d.ts +2 -3
  154. package/dist/components/SegmentedControl.meta.d.ts.map +1 -1
  155. package/dist/components/SegmentedControl.meta.js +3 -1
  156. package/dist/components/SegmentedControl.meta.js.map +1 -1
  157. package/dist/components/SegmentedControl.parts.d.ts.map +1 -1
  158. package/dist/components/SegmentedControl.parts.js +4 -9
  159. package/dist/components/SegmentedControl.parts.js.map +1 -1
  160. package/dist/components/Status.meta.d.ts +0 -2
  161. package/dist/components/Status.meta.d.ts.map +1 -1
  162. package/dist/components/Stepper.meta.d.ts +1 -2
  163. package/dist/components/Stepper.meta.d.ts.map +1 -1
  164. package/dist/components/Stepper.meta.js +1 -0
  165. package/dist/components/Stepper.meta.js.map +1 -1
  166. package/dist/components/Stepper.parts.d.ts.map +1 -1
  167. package/dist/components/Stepper.parts.js +1 -1
  168. package/dist/components/Stepper.parts.js.map +1 -1
  169. package/dist/components/Switch.meta.d.ts +1 -6
  170. package/dist/components/Switch.meta.d.ts.map +1 -1
  171. package/dist/components/Switch.meta.js +1 -5
  172. package/dist/components/Switch.meta.js.map +1 -1
  173. package/dist/components/TabSet.meta.d.ts +2 -5
  174. package/dist/components/TabSet.meta.d.ts.map +1 -1
  175. package/dist/components/TabSet.meta.js +3 -1
  176. package/dist/components/TabSet.meta.js.map +1 -1
  177. package/dist/components/Tag.meta.d.ts +0 -2
  178. package/dist/components/Tag.meta.d.ts.map +1 -1
  179. package/dist/components/TextArea.meta.d.ts +1 -6
  180. package/dist/components/TextArea.meta.d.ts.map +1 -1
  181. package/dist/components/TextArea.meta.js +1 -5
  182. package/dist/components/TextArea.meta.js.map +1 -1
  183. package/dist/components/ToggleButton.js +2 -2
  184. package/dist/components/ToggleButton.js.map +1 -1
  185. package/dist/components/ToggleButton.meta.d.ts +1 -12
  186. package/dist/components/ToggleButton.meta.d.ts.map +1 -1
  187. package/dist/components/ToggleButton.meta.js +1 -6
  188. package/dist/components/ToggleButton.meta.js.map +1 -1
  189. package/dist/components/Tooltip.d.ts +2 -2
  190. package/dist/components/Tooltip.d.ts.map +1 -1
  191. package/dist/components/Tooltip.js +2 -2
  192. package/dist/components/Tooltip.js.map +1 -1
  193. package/dist/components/Tooltip.meta.d.ts +12 -7
  194. package/dist/components/Tooltip.meta.d.ts.map +1 -1
  195. package/dist/components/Tooltip.meta.js +13 -2
  196. package/dist/components/Tooltip.meta.js.map +1 -1
  197. package/dist/components/Tooltip.parts.d.ts +31 -22
  198. package/dist/components/Tooltip.parts.d.ts.map +1 -1
  199. package/dist/components/Tooltip.parts.js +127 -98
  200. package/dist/components/Tooltip.parts.js.map +1 -1
  201. package/dist/components/base/Addon.meta.d.ts +1 -1
  202. package/dist/components/base/Addon.meta.d.ts.map +1 -1
  203. package/dist/components/base/Addon.meta.js +3 -1
  204. package/dist/components/base/Addon.meta.js.map +1 -1
  205. package/dist/components/base/ButtonOrLink.d.ts +2 -2
  206. package/dist/components/base/ButtonOrLink.d.ts.map +1 -1
  207. package/dist/components/base/ButtonOrLink.parts.d.ts +14 -6
  208. package/dist/components/base/ButtonOrLink.parts.d.ts.map +1 -1
  209. package/dist/components/base/ButtonOrLink.parts.js +54 -65
  210. package/dist/components/base/ButtonOrLink.parts.js.map +1 -1
  211. package/dist/components/base/Checkable.meta.d.ts +1 -2
  212. package/dist/components/base/Checkable.meta.d.ts.map +1 -1
  213. package/dist/components/base/Checkable.parts.d.ts +6 -6
  214. package/dist/components/base/Checkable.parts.d.ts.map +1 -1
  215. package/dist/components/base/Checkable.parts.js +2 -2
  216. package/dist/components/base/Checkable.parts.js.map +1 -1
  217. package/dist/components/base/Field.meta.d.ts +1 -2
  218. package/dist/components/base/Field.meta.d.ts.map +1 -1
  219. package/dist/components/base/Field.parts.d.ts +5 -4
  220. package/dist/components/base/Field.parts.d.ts.map +1 -1
  221. package/dist/components/base/Field.parts.js +1 -1
  222. package/dist/components/base/Field.parts.js.map +1 -1
  223. package/dist/components/base/MaybeButtonOrLink.d.ts +20 -3
  224. package/dist/components/base/MaybeButtonOrLink.d.ts.map +1 -1
  225. package/dist/components/base/MaybeButtonOrLink.js +5 -3
  226. package/dist/components/base/MaybeButtonOrLink.js.map +1 -1
  227. package/dist/components/base/Portal.d.ts +1 -1
  228. package/dist/components/base/Portal.d.ts.map +1 -1
  229. package/dist/components/base/Portal.js +3 -6
  230. package/dist/components/base/Portal.js.map +1 -1
  231. package/dist/components/base/Presence.d.ts +157 -0
  232. package/dist/components/base/Presence.d.ts.map +1 -0
  233. package/dist/components/base/Presence.js +808 -0
  234. package/dist/components/base/Presence.js.map +1 -0
  235. package/dist/components/base/Render.d.ts +21 -6
  236. package/dist/components/base/Render.d.ts.map +1 -1
  237. package/dist/components/base/Render.js +3 -2
  238. package/dist/components/base/Render.js.map +1 -1
  239. package/dist/components/base/Transition.js +2 -2
  240. package/dist/components/base/Transition.meta.d.ts +1 -1
  241. package/dist/components/base/Transition.meta.d.ts.map +1 -1
  242. package/dist/components/base/Transition.meta.js +1 -0
  243. package/dist/components/base/Transition.meta.js.map +1 -1
  244. package/dist/components/base/index.d.ts +2 -2
  245. package/dist/components/base/index.d.ts.map +1 -1
  246. package/dist/components/base/index.js +2 -2
  247. package/dist/components/base/index.js.map +1 -1
  248. package/dist/components/index.d.ts +3 -1
  249. package/dist/components/index.d.ts.map +1 -1
  250. package/dist/components/index.js +3 -1
  251. package/dist/components/index.js.map +1 -1
  252. package/dist/hooks/index.d.ts +1 -0
  253. package/dist/hooks/index.d.ts.map +1 -1
  254. package/dist/hooks/index.js +1 -0
  255. package/dist/hooks/index.js.map +1 -1
  256. package/dist/hooks/useCSSProp.d.ts.map +1 -1
  257. package/dist/hooks/useCSSProp.js +7 -7
  258. package/dist/hooks/useCSSProp.js.map +1 -1
  259. package/dist/hooks/useCSSProps.d.ts +11 -13
  260. package/dist/hooks/useCSSProps.d.ts.map +1 -1
  261. package/dist/hooks/useCSSProps.js +11 -19
  262. package/dist/hooks/useCSSProps.js.map +1 -1
  263. package/dist/hooks/useCSSPropsPolyfill.d.ts +1 -1
  264. package/dist/hooks/useCSSPropsPolyfill.d.ts.map +1 -1
  265. package/dist/hooks/useCSSPropsPolyfill.js +12 -20
  266. package/dist/hooks/useCSSPropsPolyfill.js.map +1 -1
  267. package/dist/hooks/useCSSState.d.ts.map +1 -1
  268. package/dist/hooks/useCSSState.js +7 -3
  269. package/dist/hooks/useCSSState.js.map +1 -1
  270. package/dist/hooks/useControlled.d.ts.map +1 -1
  271. package/dist/hooks/useControlled.js +6 -4
  272. package/dist/hooks/useControlled.js.map +1 -1
  273. package/dist/hooks/useEffectWithRefDeps.d.ts +2 -2
  274. package/dist/hooks/useEffectWithRefDeps.d.ts.map +1 -1
  275. package/dist/hooks/useEffectWithRefDeps.js +1 -1
  276. package/dist/hooks/useEffectWithRefDeps.js.map +1 -1
  277. package/dist/hooks/useFirstRender.d.ts +14 -0
  278. package/dist/hooks/useFirstRender.d.ts.map +1 -0
  279. package/dist/hooks/useFirstRender.js +20 -0
  280. package/dist/hooks/useFirstRender.js.map +1 -0
  281. package/dist/hooks/useGDS.d.ts +1 -1
  282. package/dist/hooks/useGDS.js +1 -1
  283. package/dist/hooks/useGDS.js.map +1 -1
  284. package/dist/hooks/usePrevious.d.ts +6 -4
  285. package/dist/hooks/usePrevious.d.ts.map +1 -1
  286. package/dist/hooks/usePrevious.js +6 -4
  287. package/dist/hooks/usePrevious.js.map +1 -1
  288. package/dist/hooks/useRefWithInit.d.ts +2 -2
  289. package/dist/hooks/useRefWithInit.d.ts.map +1 -1
  290. package/dist/hooks/useRefWithInit.js.map +1 -1
  291. package/dist/hooks/useStyleObserver.d.ts +2 -2
  292. package/dist/hooks/useStyleObserver.d.ts.map +1 -1
  293. package/dist/hooks/useStyleObserver.js +1 -1
  294. package/dist/hooks/useStyleObserver.js.map +1 -1
  295. package/dist/icons/CalendarDynamicIcon.d.ts +8 -5
  296. package/dist/icons/CalendarDynamicIcon.d.ts.map +1 -1
  297. package/dist/icons/CalendarDynamicIcon.js +5 -2
  298. package/dist/icons/CalendarDynamicIcon.js.map +1 -1
  299. package/dist/icons/CopyInteractiveIcon.d.ts +5 -4
  300. package/dist/icons/CopyInteractiveIcon.d.ts.map +1 -1
  301. package/dist/icons/CopyInteractiveIcon.js +2 -2
  302. package/dist/icons/CopyInteractiveIcon.js.map +1 -1
  303. package/dist/icons/SidebarLeftInteractiveIcon.d.ts +4 -3
  304. package/dist/icons/SidebarLeftInteractiveIcon.d.ts.map +1 -1
  305. package/dist/icons/SidebarLeftInteractiveIcon.js +2 -2
  306. package/dist/icons/SidebarLeftInteractiveIcon.js.map +1 -1
  307. package/dist/icons/SidebarRightInteractiveIcon.d.ts +4 -3
  308. package/dist/icons/SidebarRightInteractiveIcon.d.ts.map +1 -1
  309. package/dist/icons/SidebarRightInteractiveIcon.js +2 -2
  310. package/dist/icons/SidebarRightInteractiveIcon.js.map +1 -1
  311. package/dist/tailwind-plugin.d.ts.map +1 -1
  312. package/dist/tailwind-plugin.js +8 -5
  313. package/dist/tailwind-plugin.js.map +1 -1
  314. package/dist/utils/InlineCounter.d.ts +3 -0
  315. package/dist/utils/InlineCounter.d.ts.map +1 -0
  316. package/dist/utils/InlineCounter.js +7 -0
  317. package/dist/utils/InlineCounter.js.map +1 -0
  318. package/dist/utils/RenderCount.d.ts +3 -0
  319. package/dist/utils/RenderCount.d.ts.map +1 -0
  320. package/dist/utils/RenderCount.js +7 -0
  321. package/dist/utils/RenderCount.js.map +1 -0
  322. package/dist/utils/cn.d.ts +3 -1
  323. package/dist/utils/cn.d.ts.map +1 -1
  324. package/dist/utils/cn.js +3 -1
  325. package/dist/utils/cn.js.map +1 -1
  326. package/dist/utils/getCSSPropsAttributes.d.ts +10 -3
  327. package/dist/utils/getCSSPropsAttributes.d.ts.map +1 -1
  328. package/dist/utils/getCSSPropsAttributes.js +4 -5
  329. package/dist/utils/getCSSPropsAttributes.js.map +1 -1
  330. package/dist/utils/index.d.ts +2 -0
  331. package/dist/utils/index.d.ts.map +1 -1
  332. package/dist/utils/index.js +2 -0
  333. package/dist/utils/index.js.map +1 -1
  334. package/dist/utils/splitProps.d.ts +1 -4
  335. package/dist/utils/splitProps.d.ts.map +1 -1
  336. package/dist/utils/splitProps.js +2 -7
  337. package/dist/utils/splitProps.js.map +1 -1
  338. package/dist/utils/trimReactNode.d.ts +10 -8
  339. package/dist/utils/trimReactNode.d.ts.map +1 -1
  340. package/dist/utils/trimReactNode.js +10 -8
  341. package/dist/utils/trimReactNode.js.map +1 -1
  342. package/package.json +21 -21
  343. package/src/GDSContext.ts +16 -0
  344. package/src/GDSProvider.tsx +31 -40
  345. package/src/components/Address.tsx +2 -2
  346. package/src/components/Avatar.tsx +8 -12
  347. package/src/components/Breadcrumbs.meta.ts +3 -1
  348. package/src/components/Breadcrumbs.parts.tsx +16 -28
  349. package/src/components/Button.tsx +114 -104
  350. package/src/components/ButtonGroup.meta.ts +8 -0
  351. package/src/components/ButtonGroup.tsx +1 -5
  352. package/src/components/Card.meta.ts +1 -0
  353. package/src/components/Card.tsx +2 -2
  354. package/src/components/Checkbox.meta.ts +1 -5
  355. package/src/components/Chip.parts.tsx +1 -11
  356. package/src/components/CodeBlock.parts.tsx +75 -50
  357. package/src/components/CodeInline.tsx +3 -3
  358. package/src/components/CopyButton.meta.ts +1 -6
  359. package/src/components/CopyButton.tsx +50 -27
  360. package/src/components/CurrencyInput.meta.ts +1 -5
  361. package/src/components/DescriptionList.parts.tsx +1 -0
  362. package/src/components/Icon.meta.ts +1 -0
  363. package/src/components/Icon.tsx +4 -4
  364. package/src/components/Input.meta.ts +1 -5
  365. package/src/components/Input.tsx +6 -7
  366. package/src/components/Keyboard.tsx +1 -1
  367. package/src/components/Link.meta.ts +1 -0
  368. package/src/components/Link.tsx +4 -5
  369. package/src/components/Menu.meta.ts +39 -1
  370. package/src/components/Menu.parts.tsx +554 -547
  371. package/src/components/Modal.meta.ts +1 -1
  372. package/src/components/Modal.parts.tsx +40 -46
  373. package/src/components/OTCInput.meta.ts +1 -5
  374. package/src/components/OTCInput.tsx +1 -1
  375. package/src/components/Pane.meta.ts +31 -0
  376. package/src/components/Pane.parts.tsx +713 -0
  377. package/src/components/Pane.tsx +17 -0
  378. package/src/components/Radio.meta.ts +1 -5
  379. package/src/components/Search.tsx +1 -1
  380. package/src/components/SegmentedControl.meta.ts +3 -1
  381. package/src/components/SegmentedControl.parts.tsx +7 -10
  382. package/src/components/Stepper.meta.ts +1 -0
  383. package/src/components/Stepper.parts.tsx +3 -1
  384. package/src/components/Switch.meta.ts +1 -5
  385. package/src/components/TabSet.meta.ts +3 -1
  386. package/src/components/TextArea.meta.ts +1 -5
  387. package/src/components/ToggleButton.meta.ts +1 -6
  388. package/src/components/ToggleButton.tsx +1 -1
  389. package/src/components/Tooltip.meta.ts +13 -2
  390. package/src/components/Tooltip.parts.tsx +241 -169
  391. package/src/components/Tooltip.tsx +2 -2
  392. package/src/components/base/Addon.meta.ts +3 -1
  393. package/src/components/base/ButtonOrLink.parts.tsx +118 -97
  394. package/src/components/base/ButtonOrLink.tsx +1 -0
  395. package/src/components/base/Checkable.parts.tsx +6 -13
  396. package/src/components/base/Field.parts.tsx +5 -5
  397. package/src/components/base/MaybeButtonOrLink.tsx +26 -5
  398. package/src/components/base/Portal.tsx +5 -7
  399. package/src/components/base/Presence.tsx +1375 -0
  400. package/src/components/base/Render.tsx +37 -15
  401. package/src/components/base/Transition.meta.ts +1 -0
  402. package/src/components/base/Transition.tsx +2 -2
  403. package/src/components/base/index.ts +9 -2
  404. package/src/components/index.ts +11 -2
  405. package/src/hooks/index.ts +1 -0
  406. package/src/hooks/useCSSProp.ts +7 -9
  407. package/src/hooks/useCSSProps.ts +13 -22
  408. package/src/hooks/useCSSPropsPolyfill.ts +15 -23
  409. package/src/hooks/useCSSState.ts +11 -6
  410. package/src/hooks/useControlled.ts +16 -8
  411. package/src/hooks/useEffectWithRefDeps.ts +2 -2
  412. package/src/hooks/useFirstRender.ts +36 -0
  413. package/src/hooks/useGDS.ts +1 -1
  414. package/src/hooks/usePrevious.ts +6 -4
  415. package/src/hooks/useRefWithInit.ts +2 -2
  416. package/src/hooks/useStyleObserver.ts +6 -2
  417. package/src/icons/CalendarDynamicIcon.tsx +16 -6
  418. package/src/icons/CopyInteractiveIcon.tsx +10 -5
  419. package/src/icons/SidebarLeftInteractiveIcon.tsx +9 -5
  420. package/src/icons/SidebarRightInteractiveIcon.tsx +9 -5
  421. package/src/tailwind-plugin.ts +8 -5
  422. package/src/utils/InlineCounter.tsx +17 -0
  423. package/src/utils/RenderCount.tsx +7 -0
  424. package/src/utils/cn.ts +3 -1
  425. package/src/utils/getCSSPropsAttributes.ts +13 -8
  426. package/src/utils/index.ts +2 -0
  427. package/src/utils/splitProps.ts +9 -9
  428. package/src/utils/trimReactNode.tsx +10 -8
  429. package/dist/components/base/ButtonOrLink.meta.d.ts +0 -2
  430. package/dist/components/base/ButtonOrLink.meta.d.ts.map +0 -1
  431. package/dist/components/base/ButtonOrLink.meta.js +0 -6
  432. package/dist/components/base/ButtonOrLink.meta.js.map +0 -1
  433. package/src/components/base/ButtonOrLink.meta.ts +0 -6
@@ -17,9 +17,10 @@ import {
17
17
  import { useMergedRefs } from '@base-ui/utils/useMergedRefs'
18
18
  import { mergeProps } from '@react-aria/utils'
19
19
  import { useButton } from 'react-aria'
20
+ import type { Merge } from 'type-fest'
20
21
 
21
22
  import { cn } from '../../utils/index.ts'
22
- import { Render, type RenderProps } from './Render.tsx'
23
+ import { Render, type RenderFn, type RenderFnProps } from './Render.tsx'
23
24
 
24
25
  interface LinkComponentObject {
25
26
  component: ElementType
@@ -35,9 +36,8 @@ type LinkComponent =
35
36
  | LinkComponentObject
36
37
  | null
37
38
 
38
- export interface ButtonOrLinkState {
39
- Element: ElementType
40
- category: 'button' | 'link' | 'other'
39
+ export type ButtonOrLinkState = {
40
+ category: 'button' | 'link'
41
41
  role: NonNullable<InternalButtonOrLinkProps['role']>
42
42
  disabled: NonNullable<InternalButtonOrLinkProps['disabled']>
43
43
  type?: InternalButtonOrLinkProps['type']
@@ -46,6 +46,16 @@ export interface ButtonOrLinkState {
46
46
  target?: InternalButtonOrLinkProps['target']
47
47
  }
48
48
 
49
+ export type ButtonOrLinkRenderState = ButtonOrLinkState & {
50
+ Element: ElementType<ButtonOrLinkRenderElementProps>
51
+ elementProps: ButtonOrLinkRenderElementProps
52
+ }
53
+
54
+ interface ButtonOrLinkRenderElementProps {
55
+ buttonOrLinkState: ButtonOrLinkState
56
+ [key: string]: unknown
57
+ }
58
+
49
59
  export declare namespace InternalButtonOrLinkProps {
50
60
  interface DisableableProps {
51
61
  disabled?: boolean | 'focusable' | undefined
@@ -61,10 +71,8 @@ export declare namespace InternalButtonOrLinkProps {
61
71
  */
62
72
  inline?: boolean | undefined
63
73
  /** Custom render function to control the rendered element. */
64
- render?:
65
- | ((renderProps: Record<string, unknown>, state: ButtonOrLinkState) => ReactNode)
66
- | undefined
67
- /** Custom component to use for rendering links (e.g., Next.js Link) */
74
+ render?: RenderFn<ButtonOrLinkRenderState> | undefined
75
+ /** Custom component to use for rendering links (e.g. Next.js Link) */
68
76
  linkComponent?: LinkComponent | undefined
69
77
  }
70
78
  interface ButtonProps
@@ -117,20 +125,25 @@ export function useAncestorButtonOrLink() {
117
125
  return useContext(ButtonOrLinkContext)
118
126
  }
119
127
 
120
- interface WithButtonOrLinkContextProps {
121
- buttonOrLinkState: ButtonOrLinkState
122
- }
128
+ /**
129
+ * Creating "with context" components as opposed to wrapping `ButtonOrLink`'s returned element in a
130
+ * context provider to avoid a "Trying to render a nested `ButtonOrLink`" error when rendering
131
+ * `ButtonOrLink` siblings in the `render` function (like `Card` does with `interactiveContent`).
132
+ */
123
133
 
124
- const memoizedWithContextComponents = new Map<ElementType, ElementType>()
134
+ type WithContextComponent<T extends ElementType> = (
135
+ props: Merge<ComponentProps<T>, ButtonOrLinkRenderElementProps>,
136
+ ) => ReactElement
125
137
 
126
- function withContext<T extends ElementType>(Element: T) {
127
- if (memoizedWithContextComponents.has(Element)) {
128
- return memoizedWithContextComponents.get(Element)!
129
- }
130
- const newWithContextComponent = ({
138
+ const memoizedWithContextComponents = new Map<ElementType, WithContextComponent<ElementType>>()
139
+
140
+ function withContext<T extends ElementType>(Element: T): WithContextComponent<T> {
141
+ const cached = memoizedWithContextComponents.get(Element)
142
+ if (cached) return cached
143
+ const newWithContextComponent: WithContextComponent<ElementType> = ({
131
144
  buttonOrLinkState,
132
145
  ...props
133
- }: WithButtonOrLinkContextProps & ComponentProps<T>) => (
146
+ }) => (
134
147
  <ButtonOrLinkContext.Provider value={buttonOrLinkState}>
135
148
  <Element {...(props as ComponentProps<T>)} />
136
149
  </ButtonOrLinkContext.Provider>
@@ -142,7 +155,7 @@ function withContext<T extends ElementType>(Element: T) {
142
155
  const ButtonWithContext = withContext('button')
143
156
  const SpanButtonWithContext = withContext(SpanButton)
144
157
  const AnchorWithContext = withContext('a')
145
- const RenderWithContext = withContext(Render as ElementType<RenderProps>)
158
+ const RenderWithContext = withContext(Render)
146
159
 
147
160
  interface ButtonOrLinkConfigContextValue {
148
161
  onClick:
@@ -186,12 +199,42 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
186
199
  disabled = false,
187
200
  inline = false,
188
201
  linkComponent: passedLinkComponent,
189
- render,
190
- onClick,
202
+ render: passedRender,
191
203
  className: passedClassName,
192
204
  children,
193
205
  ...nonBaseProps
194
206
  } = props
207
+ const manuallyDisabledEventProps = {
208
+ onClick: undefined,
209
+ onMouseDown: undefined,
210
+ onMouseUp: undefined,
211
+ onPointerDown: undefined,
212
+ onPointerUp: undefined,
213
+ onTouchStart: undefined,
214
+ onTouchEnd: undefined,
215
+ onKeyDown: undefined,
216
+ onKeyUp: undefined,
217
+ }
218
+
219
+ const render = (
220
+ Element: ElementType<ButtonOrLinkRenderElementProps>,
221
+ renderProps: RenderFnProps,
222
+ buttonOrLinkState: ButtonOrLinkState,
223
+ extraElementProps?: Record<string, unknown>,
224
+ ) => {
225
+ const elementProps: ButtonOrLinkRenderElementProps = { buttonOrLinkState, ...extraElementProps }
226
+ const renderState: ButtonOrLinkRenderState = {
227
+ ...buttonOrLinkState,
228
+ Element,
229
+ elementProps,
230
+ }
231
+ return passedRender ? (
232
+ passedRender(renderProps, renderState)
233
+ ) : (
234
+ <Element {...renderProps} {...elementProps} />
235
+ )
236
+ }
237
+
195
238
  const className = cn('gds-button-or-link', passedClassName)
196
239
 
197
240
  if (props.href === undefined) {
@@ -212,17 +255,6 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
212
255
  )
213
256
  }
214
257
 
215
- const Element = inline ? SpanButtonWithContext : ButtonWithContext
216
-
217
- const state: ButtonOrLinkState = {
218
- Element,
219
- category: 'button',
220
- role,
221
- disabled,
222
- type,
223
- checked,
224
- }
225
-
226
258
  const checkedAttribute =
227
259
  checked === undefined
228
260
  ? {}
@@ -241,7 +273,7 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
241
273
  return { 'aria-checked': checkedOrMixed }
242
274
  })(checked)
243
275
 
244
- let buttonProps: ComponentProps<typeof Element> = {
276
+ const buttonProps: ComponentProps<'button'> = {
245
277
  role,
246
278
  type: disabled === 'focusable' ? 'button' : type,
247
279
  disabled: disabled === true,
@@ -249,15 +281,23 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
249
281
  ...checkedAttribute,
250
282
  className,
251
283
  children,
252
- buttonOrLinkState: state,
284
+ ...(remainingProps as ComponentProps<'button'>),
285
+ ...((disabled === 'focusable' || (disabled && inline)) && manuallyDisabledEventProps),
253
286
  }
254
- buttonProps = {
255
- ...buttonProps,
256
- onClick: !disabled ? (onClick as typeof buttonProps.onClick) : undefined,
257
- ...(remainingProps as typeof buttonProps),
287
+
288
+ const buttonOrLinkState: ButtonOrLinkState = {
289
+ category: 'button',
290
+ role,
291
+ disabled,
292
+ type,
293
+ checked,
258
294
  }
259
295
 
260
- return render ? render(buttonProps, state) : <Element {...buttonProps} />
296
+ return render(
297
+ inline ? SpanButtonWithContext : ButtonWithContext,
298
+ buttonProps,
299
+ buttonOrLinkState,
300
+ )
261
301
  }
262
302
 
263
303
  const {
@@ -271,35 +311,16 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
271
311
  ...remainingProps
272
312
  } = nonBaseProps
273
313
 
274
- const state: ButtonOrLinkState = {
275
- Element: 'a',
276
- category: 'link',
277
- role,
278
- disabled,
279
- href,
280
- target,
281
- }
282
-
283
- let linkProps: ComponentProps<'a'> = disabled
284
- ? {
285
- role,
286
- tabIndex: disabled === 'focusable' ? 0 : undefined,
287
- 'aria-disabled': true,
288
- className,
289
- children,
290
- }
291
- : {
292
- role: role !== 'link' ? role : undefined,
293
- href,
294
- target,
295
- rel,
296
- className,
297
- children,
298
- }
299
- linkProps = {
300
- ...linkProps,
301
- onClick: !disabled ? (onClick as typeof linkProps.onClick) : undefined,
302
- ...(remainingProps as typeof linkProps),
314
+ let linkProps: ComponentProps<'a'> = {
315
+ role: disabled || role !== 'link' ? role : undefined,
316
+ href: !disabled ? href : undefined,
317
+ target: !disabled ? target : undefined,
318
+ rel: !disabled ? rel : undefined,
319
+ 'aria-disabled': Boolean(disabled) || undefined,
320
+ className,
321
+ children,
322
+ ...(remainingProps as ComponentProps<'a'>),
323
+ ...(disabled && manuallyDisabledEventProps),
303
324
  }
304
325
 
305
326
  let linkComponent: ElementType | ReactElement | null = null
@@ -317,29 +338,28 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
317
338
  }
318
339
  }
319
340
 
320
- if (isValidElement(linkComponent)) {
321
- const Element = RenderWithContext
322
- state.Element = Element
323
-
324
- const elementProps = {
325
- ...linkProps,
326
- render: linkComponent,
327
- buttonOrLinkState: state,
328
- }
329
-
330
- return render ? render(elementProps, state) : <Element {...elementProps} />
341
+ const buttonOrLinkState: ButtonOrLinkState = {
342
+ category: 'link',
343
+ role,
344
+ disabled,
345
+ href,
346
+ target,
331
347
  }
332
348
 
333
- const Element =
334
- linkComponent && linkComponent !== 'a' ? withContext(linkComponent) : AnchorWithContext
335
- state.Element = Element
336
-
337
- const elementProps = {
338
- ...linkProps,
339
- buttonOrLinkState: state,
349
+ if (isValidElement(linkComponent)) {
350
+ return render(
351
+ RenderWithContext as ButtonOrLinkRenderState['Element'],
352
+ linkProps,
353
+ buttonOrLinkState,
354
+ { render: linkComponent },
355
+ )
340
356
  }
341
357
 
342
- return render ? render(elementProps, state) : <Element {...elementProps} />
358
+ return render(
359
+ linkComponent && linkComponent !== 'a' ? withContext(linkComponent) : AnchorWithContext,
360
+ linkProps,
361
+ buttonOrLinkState,
362
+ )
343
363
  }
344
364
  ButtonOrLinkRoot.displayName = 'ButtonOrLink'
345
365
 
@@ -425,16 +445,17 @@ function SpanButton({
425
445
  isDisabled: disabled,
426
446
  elementType: 'span',
427
447
  onPress: (event) => {
428
- const mouseEvent = new MouseEvent('click', {
429
- altKey: event.altKey,
430
- ctrlKey: event.ctrlKey,
431
- metaKey: event.metaKey,
432
- shiftKey: event.shiftKey,
433
- relatedTarget: event.target,
434
- bubbles: true,
435
- cancelable: true,
436
- })
437
- event.target.dispatchEvent(mouseEvent)
448
+ event.target.dispatchEvent(
449
+ new MouseEvent('click', {
450
+ altKey: event.altKey,
451
+ ctrlKey: event.ctrlKey,
452
+ metaKey: event.metaKey,
453
+ shiftKey: event.shiftKey,
454
+ relatedTarget: event.target,
455
+ bubbles: true,
456
+ cancelable: true,
457
+ }),
458
+ )
438
459
  },
439
460
  onPressStart: (event) => {
440
461
  if (event.pointerType === 'keyboard') setActive(true)
@@ -14,6 +14,7 @@ export { useAncestorButtonOrLink } from './ButtonOrLink.parts.tsx'
14
14
  export type {
15
15
  ButtonOrLinkProps,
16
16
  ButtonOrLinkState,
17
+ ButtonOrLinkRenderState,
17
18
  ButtonOrLinkConfigProps,
18
19
  InternalButtonOrLinkProps,
19
20
  OmitInternalButtonOrLinkProps,
@@ -1,22 +1,15 @@
1
1
  'use client'
2
2
 
3
- import {
4
- createContext,
5
- useContext,
6
- useId,
7
- type ComponentProps,
8
- type ReactElement,
9
- type ReactNode,
10
- } from 'react'
3
+ import { createContext, useContext, useId, type ComponentProps, type ReactNode } from 'react'
11
4
 
12
5
  import type { GDSComponentProps } from '@graphprotocol/gds-css'
13
6
 
14
7
  import { useCSSPropsPolyfill, useCSSState } from '../../hooks/index.ts'
15
8
  import { cn, getCSSPropsAttributes } from '../../utils/index.ts'
16
9
  import { CheckableMeta } from './Checkable.meta.ts'
17
- import { Render, type RenderProps } from './Render.tsx'
10
+ import { Render, type RenderProp } from './Render.tsx'
18
11
 
19
- export interface CheckableState {
12
+ export type CheckableState = {
20
13
  inputProps: {
21
14
  name: string | undefined
22
15
  value: string | undefined
@@ -36,7 +29,7 @@ export interface CheckableProps
36
29
  value: string | undefined
37
30
  checked: boolean | 'indeterminate' | undefined
38
31
  disabled: boolean | undefined
39
- renderInput: (renderProps: ComponentProps<'span'>, state: CheckableState) => ReactElement
32
+ renderInput: RenderProp<CheckableState>
40
33
  }
41
34
 
42
35
  export function CheckableRoot({
@@ -185,7 +178,7 @@ export interface CheckableLabelProps extends ComponentProps<'span'> {
185
178
  * `<Card as="label" />`). Defaults to `<label />`, unless there is an ancestor `CheckableLabel`,
186
179
  * in which case it defaults to `<span />`.
187
180
  */
188
- render?: RenderProps['render'] | undefined
181
+ render?: RenderProp | undefined
189
182
  }
190
183
 
191
184
  export function CheckableLabel({
@@ -209,8 +202,8 @@ export function CheckableLabel({
209
202
  <CheckableLabelContext.Provider value={true}>
210
203
  <Render
211
204
  ref={statePassedRef}
212
- data-focus-ring={focusRing || undefined}
213
205
  render={render ?? (renderLabel ? <label /> : <span />)}
206
+ data-focus-ring={focusRing || undefined}
214
207
  className={cn(
215
208
  renderLabel ? 'group/label gds-checkable-label' : null,
216
209
  `uu:data-focus-ring:focus-visible:outline
@@ -1,6 +1,6 @@
1
1
  'use client'
2
2
 
3
- import { useId, type ComponentProps, type ReactElement, type ReactNode } from 'react'
3
+ import { useId, type ComponentProps, type ReactNode } from 'react'
4
4
 
5
5
  import type { GDSComponentProps } from '@graphprotocol/gds-css'
6
6
 
@@ -9,9 +9,9 @@ import { CheckCircleIcon, WarningDiamondIcon, WarningIcon } from '../../icons/in
9
9
  import { cn, getCSSPropsAttributes, type OptionValue } from '../../utils/index.ts'
10
10
  import { Label, type LabelProps } from '../Label.tsx'
11
11
  import { FieldMeta } from './Field.meta.ts'
12
- import { Render } from './Render.tsx'
12
+ import { Render, type RenderProp } from './Render.tsx'
13
13
 
14
- export interface FieldState {
14
+ export type FieldState = {
15
15
  inputProps: {
16
16
  placeholder: string // Ensure there's always a `placeholder` attribute for `@state-blank` to work
17
17
  name: string | undefined
@@ -47,7 +47,7 @@ export interface FieldProps
47
47
  /** @default 'info' */
48
48
  status?: 'info' | 'warning' | 'error' | 'success' | undefined
49
49
  message?: ReactNode | undefined
50
- renderInput: (renderProps: ComponentProps<'div'>, state: FieldState) => ReactElement
50
+ renderInput: RenderProp<FieldState>
51
51
  }
52
52
 
53
53
  export const FieldRoot = ({
@@ -234,7 +234,7 @@ export const FieldRoot = ({
234
234
  `)}
235
235
  />
236
236
  <div
237
- data-visible={message ? true : undefined}
237
+ data-visible={Boolean(message) || undefined}
238
238
  className={`
239
239
  mt-2 flex gap-1 text-12 text-form-helper
240
240
  not-data-visible:sr-only
@@ -4,30 +4,49 @@ import type { ComponentProps, ElementType } from 'react'
4
4
 
5
5
  import {
6
6
  ButtonOrLink,
7
- type ButtonOrLinkState,
7
+ type ButtonOrLinkRenderState,
8
8
  type InternalButtonOrLinkProps,
9
9
  type OmitInternalButtonOrLinkProps,
10
10
  } from './ButtonOrLink.tsx'
11
+ import type { RenderFn } from './Render.tsx'
12
+
13
+ type OtherElementRenderState = {
14
+ category: 'other'
15
+ role: ButtonOrLinkRenderState['role']
16
+ disabled: false
17
+ type?: undefined
18
+ checked?: undefined
19
+ href?: undefined
20
+ target?: undefined
21
+ Element: ButtonOrLinkRenderState['Element']
22
+ elementProps: ButtonOrLinkRenderState['elementProps']
23
+ }
24
+
25
+ type MaybeButtonOrLinkRenderState = ButtonOrLinkRenderState | OtherElementRenderState
11
26
 
12
27
  export declare namespace MaybeButtonOrLinkProps {
13
28
  export type DisableableProps = InternalButtonOrLinkProps.DisableableProps
14
29
  export type ButtonProps = OmitInternalButtonOrLinkProps<InternalButtonOrLinkProps.ButtonProps> & {
15
30
  onClick: NonNullable<InternalButtonOrLinkProps.ButtonProps['onClick']>
16
31
  as?: undefined
32
+ render?: RenderFn<MaybeButtonOrLinkRenderState> | undefined
17
33
  }
18
34
  export type ToggleButtonProps =
19
35
  OmitInternalButtonOrLinkProps<InternalButtonOrLinkProps.ToggleButtonProps> & {
20
36
  onClick: NonNullable<InternalButtonOrLinkProps.ToggleButtonProps['onClick']>
21
37
  as?: undefined
38
+ render?: RenderFn<MaybeButtonOrLinkRenderState> | undefined
22
39
  }
23
40
  export type LinkProps = OmitInternalButtonOrLinkProps<InternalButtonOrLinkProps.LinkProps> & {
24
41
  as?: undefined
42
+ render?: RenderFn<MaybeButtonOrLinkRenderState> | undefined
25
43
  }
26
44
  export type OtherElementProps =
27
45
  OmitInternalButtonOrLinkProps<InternalButtonOrLinkProps.BaseProps> &
28
46
  ComponentProps<'span'> & {
29
47
  onClick?: InternalButtonOrLinkProps.ButtonProps['onClick'] // Not technically correct, but prevents the event from being `any` when `as` is not specified
30
48
  as?: ElementType | undefined
49
+ render?: RenderFn<MaybeButtonOrLinkRenderState> | undefined
31
50
  disabled?: undefined
32
51
  type?: undefined
33
52
  checked?: undefined
@@ -44,7 +63,7 @@ export type MaybeButtonOrLinkProps =
44
63
 
45
64
  type InternalMaybeButtonOrLinkProps = MaybeButtonOrLinkProps &
46
65
  InternalButtonOrLinkProps.DisableableProps &
47
- InternalButtonOrLinkProps.BaseProps
66
+ Omit<InternalButtonOrLinkProps.BaseProps, 'render'>
48
67
 
49
68
  /**
50
69
  * Renders a `ButtonOrLink` if one of `href` or `onClick` is passed along with no `as`. Otherwise,
@@ -67,13 +86,15 @@ export function MaybeButtonOrLink(props: InternalMaybeButtonOrLinkProps) {
67
86
  ...otherElementProps
68
87
  } = props
69
88
 
70
- const state: ButtonOrLinkState = {
71
- Element,
89
+ const renderState: OtherElementRenderState = {
72
90
  category: 'other',
73
91
  role: props.role ?? 'none',
74
92
  disabled: false,
93
+ // The types lie to ensure there's a type error if consumers forget to spread `elementProps` on `Element`
94
+ Element: Element as OtherElementRenderState['Element'],
95
+ elementProps: {} as OtherElementRenderState['elementProps'],
75
96
  }
76
97
 
77
- return render ? render(otherElementProps, state) : <Element {...otherElementProps} />
98
+ return render ? render(otherElementProps, renderState) : <Element {...otherElementProps} />
78
99
  }
79
100
  }
@@ -1,17 +1,15 @@
1
1
  'use client'
2
2
 
3
- import { useEffect, useState, type ReactNode } from 'react'
3
+ import type { ReactNode } from 'react'
4
4
  import { createPortal } from 'react-dom'
5
5
 
6
- export function Portal({ children }: { children: ReactNode }) {
7
- const [mounted, setMounted] = useState(false)
6
+ import { useFirstRender } from '../../hooks/index.ts'
8
7
 
9
- useEffect(() => {
10
- setMounted(true)
11
- }, [])
8
+ export function Portal({ children }: { children: ReactNode }) {
9
+ const firstRender = useFirstRender({ immediatelyRerender: true })
12
10
 
13
11
  // Don't render until after hydration
14
- if (!mounted) {
12
+ if (firstRender) {
15
13
  return null
16
14
  }
17
15