@graphprotocol/gds-react 0.1.2 → 0.2.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 (373) hide show
  1. package/dist/GDSProvider.d.ts +12 -10
  2. package/dist/GDSProvider.d.ts.map +1 -1
  3. package/dist/GDSProvider.js +10 -8
  4. package/dist/GDSProvider.js.map +1 -1
  5. package/dist/components/Address.js +2 -2
  6. package/dist/components/Address.meta.d.ts +1 -13
  7. package/dist/components/Address.meta.d.ts.map +1 -1
  8. package/dist/components/Avatar.d.ts.map +1 -1
  9. package/dist/components/Avatar.js +2 -10
  10. package/dist/components/Avatar.js.map +1 -1
  11. package/dist/components/Avatar.meta.d.ts +0 -2
  12. package/dist/components/Avatar.meta.d.ts.map +1 -1
  13. package/dist/components/AvatarGroup.meta.d.ts +8 -2
  14. package/dist/components/AvatarGroup.meta.d.ts.map +1 -1
  15. package/dist/components/Breadcrumbs.meta.d.ts +2 -3
  16. package/dist/components/Breadcrumbs.meta.d.ts.map +1 -1
  17. package/dist/components/Breadcrumbs.meta.js +3 -1
  18. package/dist/components/Breadcrumbs.meta.js.map +1 -1
  19. package/dist/components/Breadcrumbs.parts.d.ts.map +1 -1
  20. package/dist/components/Breadcrumbs.parts.js +13 -21
  21. package/dist/components/Breadcrumbs.parts.js.map +1 -1
  22. package/dist/components/Button.d.ts.map +1 -1
  23. package/dist/components/Button.js +10 -9
  24. package/dist/components/Button.js.map +1 -1
  25. package/dist/components/Button.meta.d.ts +1 -4
  26. package/dist/components/Button.meta.d.ts.map +1 -1
  27. package/dist/components/ButtonGroup.d.ts.map +1 -1
  28. package/dist/components/ButtonGroup.js +1 -5
  29. package/dist/components/ButtonGroup.js.map +1 -1
  30. package/dist/components/ButtonGroup.meta.d.ts +1 -5
  31. package/dist/components/ButtonGroup.meta.d.ts.map +1 -1
  32. package/dist/components/ButtonGroup.meta.js +8 -0
  33. package/dist/components/ButtonGroup.meta.js.map +1 -1
  34. package/dist/components/Card.meta.d.ts +1 -2
  35. package/dist/components/Card.meta.d.ts.map +1 -1
  36. package/dist/components/Card.meta.js +1 -0
  37. package/dist/components/Card.meta.js.map +1 -1
  38. package/dist/components/Checkbox.meta.d.ts +1 -6
  39. package/dist/components/Checkbox.meta.d.ts.map +1 -1
  40. package/dist/components/Checkbox.meta.js +1 -5
  41. package/dist/components/Checkbox.meta.js.map +1 -1
  42. package/dist/components/Chip.meta.d.ts +2 -4
  43. package/dist/components/Chip.meta.d.ts.map +1 -1
  44. package/dist/components/Chip.parts.d.ts.map +1 -1
  45. package/dist/components/Chip.parts.js +1 -9
  46. package/dist/components/Chip.parts.js.map +1 -1
  47. package/dist/components/Cluster.meta.d.ts +8 -2
  48. package/dist/components/Cluster.meta.d.ts.map +1 -1
  49. package/dist/components/CodeBlock.d.ts +1 -1
  50. package/dist/components/CodeBlock.meta.d.ts +2 -4
  51. package/dist/components/CodeBlock.meta.d.ts.map +1 -1
  52. package/dist/components/CodeBlock.parts.d.ts +6 -7
  53. package/dist/components/CodeBlock.parts.d.ts.map +1 -1
  54. package/dist/components/CodeBlock.parts.js +28 -10
  55. package/dist/components/CodeBlock.parts.js.map +1 -1
  56. package/dist/components/CodeInline.js +3 -3
  57. package/dist/components/CodeInline.meta.d.ts +1 -1
  58. package/dist/components/CodeInline.meta.d.ts.map +1 -1
  59. package/dist/components/CopyButton.d.ts.map +1 -1
  60. package/dist/components/CopyButton.js +2 -4
  61. package/dist/components/CopyButton.js.map +1 -1
  62. package/dist/components/CopyButton.meta.d.ts +1 -12
  63. package/dist/components/CopyButton.meta.d.ts.map +1 -1
  64. package/dist/components/CopyButton.meta.js +1 -6
  65. package/dist/components/CopyButton.meta.js.map +1 -1
  66. package/dist/components/CurrencyInput.meta.d.ts +1 -6
  67. package/dist/components/CurrencyInput.meta.d.ts.map +1 -1
  68. package/dist/components/CurrencyInput.meta.js +1 -5
  69. package/dist/components/CurrencyInput.meta.js.map +1 -1
  70. package/dist/components/DescriptionList.meta.d.ts +2 -5
  71. package/dist/components/DescriptionList.meta.d.ts.map +1 -1
  72. package/dist/components/DescriptionList.parts.d.ts +3 -0
  73. package/dist/components/DescriptionList.parts.d.ts.map +1 -1
  74. package/dist/components/DescriptionList.parts.js +1 -0
  75. package/dist/components/DescriptionList.parts.js.map +1 -1
  76. package/dist/components/Divider.meta.d.ts +1 -3
  77. package/dist/components/Divider.meta.d.ts.map +1 -1
  78. package/dist/components/Icon.js +4 -4
  79. package/dist/components/Icon.js.map +1 -1
  80. package/dist/components/Icon.meta.d.ts +0 -2
  81. package/dist/components/Icon.meta.d.ts.map +1 -1
  82. package/dist/components/Icon.meta.js +1 -0
  83. package/dist/components/Icon.meta.js.map +1 -1
  84. package/dist/components/Input.d.ts +5 -4
  85. package/dist/components/Input.d.ts.map +1 -1
  86. package/dist/components/Input.js +1 -0
  87. package/dist/components/Input.js.map +1 -1
  88. package/dist/components/Input.meta.d.ts +1 -6
  89. package/dist/components/Input.meta.d.ts.map +1 -1
  90. package/dist/components/Input.meta.js +1 -5
  91. package/dist/components/Input.meta.js.map +1 -1
  92. package/dist/components/Keyboard.js +1 -1
  93. package/dist/components/Keyboard.meta.d.ts +0 -1
  94. package/dist/components/Keyboard.meta.d.ts.map +1 -1
  95. package/dist/components/Label.meta.d.ts +1 -3
  96. package/dist/components/Label.meta.d.ts.map +1 -1
  97. package/dist/components/Link.d.ts +1 -1
  98. package/dist/components/Link.d.ts.map +1 -1
  99. package/dist/components/Link.js +1 -2
  100. package/dist/components/Link.js.map +1 -1
  101. package/dist/components/Link.meta.d.ts +1 -2
  102. package/dist/components/Link.meta.d.ts.map +1 -1
  103. package/dist/components/Link.meta.js +1 -0
  104. package/dist/components/Link.meta.js.map +1 -1
  105. package/dist/components/Menu.meta.d.ts +31 -2
  106. package/dist/components/Menu.meta.d.ts.map +1 -1
  107. package/dist/components/Menu.meta.js +39 -1
  108. package/dist/components/Menu.meta.js.map +1 -1
  109. package/dist/components/Menu.parts.d.ts +23 -32
  110. package/dist/components/Menu.parts.d.ts.map +1 -1
  111. package/dist/components/Menu.parts.js +284 -303
  112. package/dist/components/Menu.parts.js.map +1 -1
  113. package/dist/components/Modal.d.ts +1 -1
  114. package/dist/components/Modal.meta.d.ts +1 -3
  115. package/dist/components/Modal.meta.d.ts.map +1 -1
  116. package/dist/components/Modal.meta.js +1 -1
  117. package/dist/components/Modal.meta.js.map +1 -1
  118. package/dist/components/Modal.parts.d.ts +14 -15
  119. package/dist/components/Modal.parts.d.ts.map +1 -1
  120. package/dist/components/Modal.parts.js +36 -32
  121. package/dist/components/Modal.parts.js.map +1 -1
  122. package/dist/components/OTCInput.js +1 -1
  123. package/dist/components/OTCInput.meta.d.ts +1 -6
  124. package/dist/components/OTCInput.meta.d.ts.map +1 -1
  125. package/dist/components/OTCInput.meta.js +1 -5
  126. package/dist/components/OTCInput.meta.js.map +1 -1
  127. package/dist/components/Radio.meta.d.ts +1 -6
  128. package/dist/components/Radio.meta.d.ts.map +1 -1
  129. package/dist/components/Radio.meta.js +1 -5
  130. package/dist/components/Radio.meta.js.map +1 -1
  131. package/dist/components/Search.meta.d.ts +1 -3
  132. package/dist/components/Search.meta.d.ts.map +1 -1
  133. package/dist/components/SegmentedControl.meta.d.ts +2 -3
  134. package/dist/components/SegmentedControl.meta.d.ts.map +1 -1
  135. package/dist/components/SegmentedControl.meta.js +3 -1
  136. package/dist/components/SegmentedControl.meta.js.map +1 -1
  137. package/dist/components/SegmentedControl.parts.d.ts.map +1 -1
  138. package/dist/components/SegmentedControl.parts.js +4 -9
  139. package/dist/components/SegmentedControl.parts.js.map +1 -1
  140. package/dist/components/Status.meta.d.ts +0 -2
  141. package/dist/components/Status.meta.d.ts.map +1 -1
  142. package/dist/components/Stepper.meta.d.ts +1 -2
  143. package/dist/components/Stepper.meta.d.ts.map +1 -1
  144. package/dist/components/Stepper.meta.js +1 -0
  145. package/dist/components/Stepper.meta.js.map +1 -1
  146. package/dist/components/Stepper.parts.d.ts.map +1 -1
  147. package/dist/components/Stepper.parts.js +1 -1
  148. package/dist/components/Stepper.parts.js.map +1 -1
  149. package/dist/components/Switch.meta.d.ts +1 -6
  150. package/dist/components/Switch.meta.d.ts.map +1 -1
  151. package/dist/components/Switch.meta.js +1 -5
  152. package/dist/components/Switch.meta.js.map +1 -1
  153. package/dist/components/TabSet.meta.d.ts +2 -5
  154. package/dist/components/TabSet.meta.d.ts.map +1 -1
  155. package/dist/components/TabSet.meta.js +3 -1
  156. package/dist/components/TabSet.meta.js.map +1 -1
  157. package/dist/components/Tag.meta.d.ts +0 -2
  158. package/dist/components/Tag.meta.d.ts.map +1 -1
  159. package/dist/components/TextArea.meta.d.ts +1 -6
  160. package/dist/components/TextArea.meta.d.ts.map +1 -1
  161. package/dist/components/TextArea.meta.js +1 -5
  162. package/dist/components/TextArea.meta.js.map +1 -1
  163. package/dist/components/ToggleButton.js +2 -2
  164. package/dist/components/ToggleButton.js.map +1 -1
  165. package/dist/components/ToggleButton.meta.d.ts +1 -12
  166. package/dist/components/ToggleButton.meta.d.ts.map +1 -1
  167. package/dist/components/ToggleButton.meta.js +1 -6
  168. package/dist/components/ToggleButton.meta.js.map +1 -1
  169. package/dist/components/Tooltip.d.ts +2 -2
  170. package/dist/components/Tooltip.d.ts.map +1 -1
  171. package/dist/components/Tooltip.js +2 -2
  172. package/dist/components/Tooltip.js.map +1 -1
  173. package/dist/components/Tooltip.meta.d.ts +12 -7
  174. package/dist/components/Tooltip.meta.d.ts.map +1 -1
  175. package/dist/components/Tooltip.meta.js +13 -2
  176. package/dist/components/Tooltip.meta.js.map +1 -1
  177. package/dist/components/Tooltip.parts.d.ts +20 -20
  178. package/dist/components/Tooltip.parts.d.ts.map +1 -1
  179. package/dist/components/Tooltip.parts.js +129 -88
  180. package/dist/components/Tooltip.parts.js.map +1 -1
  181. package/dist/components/base/Addon.meta.d.ts +1 -1
  182. package/dist/components/base/Addon.meta.d.ts.map +1 -1
  183. package/dist/components/base/Addon.meta.js +3 -1
  184. package/dist/components/base/Addon.meta.js.map +1 -1
  185. package/dist/components/base/ButtonOrLink.d.ts +1 -1
  186. package/dist/components/base/ButtonOrLink.parts.d.ts +6 -5
  187. package/dist/components/base/ButtonOrLink.parts.d.ts.map +1 -1
  188. package/dist/components/base/ButtonOrLink.parts.js +28 -31
  189. package/dist/components/base/ButtonOrLink.parts.js.map +1 -1
  190. package/dist/components/base/Checkable.meta.d.ts +1 -2
  191. package/dist/components/base/Checkable.meta.d.ts.map +1 -1
  192. package/dist/components/base/Checkable.parts.d.ts +6 -6
  193. package/dist/components/base/Checkable.parts.d.ts.map +1 -1
  194. package/dist/components/base/Checkable.parts.js +2 -2
  195. package/dist/components/base/Checkable.parts.js.map +1 -1
  196. package/dist/components/base/Field.meta.d.ts +1 -2
  197. package/dist/components/base/Field.meta.d.ts.map +1 -1
  198. package/dist/components/base/Field.parts.d.ts +5 -4
  199. package/dist/components/base/Field.parts.d.ts.map +1 -1
  200. package/dist/components/base/Field.parts.js +1 -1
  201. package/dist/components/base/Field.parts.js.map +1 -1
  202. package/dist/components/base/MaybeButtonOrLink.d.ts +1 -1
  203. package/dist/components/base/MaybeButtonOrLink.d.ts.map +1 -1
  204. package/dist/components/base/Portal.d.ts +1 -1
  205. package/dist/components/base/Portal.d.ts.map +1 -1
  206. package/dist/components/base/Portal.js +3 -6
  207. package/dist/components/base/Portal.js.map +1 -1
  208. package/dist/components/base/Render.d.ts +21 -6
  209. package/dist/components/base/Render.d.ts.map +1 -1
  210. package/dist/components/base/Render.js +3 -2
  211. package/dist/components/base/Render.js.map +1 -1
  212. package/dist/components/base/Transition.js +2 -2
  213. package/dist/components/base/Transition.meta.d.ts +1 -1
  214. package/dist/components/base/Transition.meta.d.ts.map +1 -1
  215. package/dist/components/base/Transition.meta.js +1 -0
  216. package/dist/components/base/Transition.meta.js.map +1 -1
  217. package/dist/components/base/index.d.ts +1 -2
  218. package/dist/components/base/index.d.ts.map +1 -1
  219. package/dist/components/base/index.js +1 -2
  220. package/dist/components/base/index.js.map +1 -1
  221. package/dist/components/index.d.ts +1 -1
  222. package/dist/components/index.d.ts.map +1 -1
  223. package/dist/components/index.js +1 -1
  224. package/dist/components/index.js.map +1 -1
  225. package/dist/hooks/index.d.ts +1 -0
  226. package/dist/hooks/index.d.ts.map +1 -1
  227. package/dist/hooks/index.js +1 -0
  228. package/dist/hooks/index.js.map +1 -1
  229. package/dist/hooks/useCSSProp.d.ts.map +1 -1
  230. package/dist/hooks/useCSSProp.js +6 -6
  231. package/dist/hooks/useCSSProp.js.map +1 -1
  232. package/dist/hooks/useCSSProps.d.ts +11 -13
  233. package/dist/hooks/useCSSProps.d.ts.map +1 -1
  234. package/dist/hooks/useCSSProps.js +11 -19
  235. package/dist/hooks/useCSSProps.js.map +1 -1
  236. package/dist/hooks/useCSSPropsPolyfill.d.ts +1 -1
  237. package/dist/hooks/useCSSPropsPolyfill.d.ts.map +1 -1
  238. package/dist/hooks/useCSSPropsPolyfill.js +12 -20
  239. package/dist/hooks/useCSSPropsPolyfill.js.map +1 -1
  240. package/dist/hooks/useCSSState.d.ts.map +1 -1
  241. package/dist/hooks/useCSSState.js +7 -3
  242. package/dist/hooks/useCSSState.js.map +1 -1
  243. package/dist/hooks/useEffectWithRefDeps.d.ts +2 -2
  244. package/dist/hooks/useEffectWithRefDeps.d.ts.map +1 -1
  245. package/dist/hooks/useEffectWithRefDeps.js +1 -1
  246. package/dist/hooks/useEffectWithRefDeps.js.map +1 -1
  247. package/dist/hooks/useFirstRender.d.ts +14 -0
  248. package/dist/hooks/useFirstRender.d.ts.map +1 -0
  249. package/dist/hooks/useFirstRender.js +20 -0
  250. package/dist/hooks/useFirstRender.js.map +1 -0
  251. package/dist/hooks/useGDS.d.ts +1 -1
  252. package/dist/hooks/usePrevious.d.ts +6 -4
  253. package/dist/hooks/usePrevious.d.ts.map +1 -1
  254. package/dist/hooks/usePrevious.js +6 -4
  255. package/dist/hooks/usePrevious.js.map +1 -1
  256. package/dist/hooks/useRefWithInit.d.ts +2 -2
  257. package/dist/hooks/useRefWithInit.d.ts.map +1 -1
  258. package/dist/hooks/useRefWithInit.js.map +1 -1
  259. package/dist/hooks/useStyleObserver.d.ts +2 -2
  260. package/dist/hooks/useStyleObserver.d.ts.map +1 -1
  261. package/dist/hooks/useStyleObserver.js.map +1 -1
  262. package/dist/icons/CalendarDynamicIcon.d.ts +8 -5
  263. package/dist/icons/CalendarDynamicIcon.d.ts.map +1 -1
  264. package/dist/icons/CalendarDynamicIcon.js +5 -2
  265. package/dist/icons/CalendarDynamicIcon.js.map +1 -1
  266. package/dist/icons/CopyInteractiveIcon.d.ts +5 -4
  267. package/dist/icons/CopyInteractiveIcon.d.ts.map +1 -1
  268. package/dist/icons/CopyInteractiveIcon.js +2 -2
  269. package/dist/icons/CopyInteractiveIcon.js.map +1 -1
  270. package/dist/icons/SidebarLeftInteractiveIcon.d.ts +4 -3
  271. package/dist/icons/SidebarLeftInteractiveIcon.d.ts.map +1 -1
  272. package/dist/icons/SidebarLeftInteractiveIcon.js +2 -2
  273. package/dist/icons/SidebarLeftInteractiveIcon.js.map +1 -1
  274. package/dist/icons/SidebarRightInteractiveIcon.d.ts +4 -3
  275. package/dist/icons/SidebarRightInteractiveIcon.d.ts.map +1 -1
  276. package/dist/icons/SidebarRightInteractiveIcon.js +2 -2
  277. package/dist/icons/SidebarRightInteractiveIcon.js.map +1 -1
  278. package/dist/tailwind-plugin.js +5 -5
  279. package/dist/tailwind-plugin.js.map +1 -1
  280. package/dist/utils/cn.d.ts +3 -1
  281. package/dist/utils/cn.d.ts.map +1 -1
  282. package/dist/utils/cn.js +3 -1
  283. package/dist/utils/cn.js.map +1 -1
  284. package/dist/utils/getCSSPropsAttributes.d.ts +10 -3
  285. package/dist/utils/getCSSPropsAttributes.d.ts.map +1 -1
  286. package/dist/utils/getCSSPropsAttributes.js +4 -5
  287. package/dist/utils/getCSSPropsAttributes.js.map +1 -1
  288. package/dist/utils/splitProps.d.ts +1 -4
  289. package/dist/utils/splitProps.d.ts.map +1 -1
  290. package/dist/utils/splitProps.js +2 -7
  291. package/dist/utils/splitProps.js.map +1 -1
  292. package/dist/utils/trimReactNode.d.ts +10 -8
  293. package/dist/utils/trimReactNode.d.ts.map +1 -1
  294. package/dist/utils/trimReactNode.js +10 -8
  295. package/dist/utils/trimReactNode.js.map +1 -1
  296. package/package.json +17 -17
  297. package/src/GDSProvider.tsx +11 -9
  298. package/src/components/Address.tsx +2 -2
  299. package/src/components/Avatar.tsx +5 -10
  300. package/src/components/Breadcrumbs.meta.ts +3 -1
  301. package/src/components/Breadcrumbs.parts.tsx +16 -28
  302. package/src/components/Button.tsx +14 -10
  303. package/src/components/ButtonGroup.meta.ts +8 -0
  304. package/src/components/ButtonGroup.tsx +1 -5
  305. package/src/components/Card.meta.ts +1 -0
  306. package/src/components/Checkbox.meta.ts +1 -5
  307. package/src/components/Chip.parts.tsx +1 -11
  308. package/src/components/CodeBlock.parts.tsx +75 -50
  309. package/src/components/CodeInline.tsx +3 -3
  310. package/src/components/CopyButton.meta.ts +1 -6
  311. package/src/components/CopyButton.tsx +3 -4
  312. package/src/components/CurrencyInput.meta.ts +1 -5
  313. package/src/components/DescriptionList.parts.tsx +1 -0
  314. package/src/components/Icon.meta.ts +1 -0
  315. package/src/components/Icon.tsx +4 -4
  316. package/src/components/Input.meta.ts +1 -5
  317. package/src/components/Input.tsx +5 -6
  318. package/src/components/Keyboard.tsx +1 -1
  319. package/src/components/Link.meta.ts +1 -0
  320. package/src/components/Link.tsx +2 -3
  321. package/src/components/Menu.meta.ts +39 -1
  322. package/src/components/Menu.parts.tsx +553 -549
  323. package/src/components/Modal.meta.ts +1 -1
  324. package/src/components/Modal.parts.tsx +67 -68
  325. package/src/components/OTCInput.meta.ts +1 -5
  326. package/src/components/OTCInput.tsx +1 -1
  327. package/src/components/Radio.meta.ts +1 -5
  328. package/src/components/SegmentedControl.meta.ts +3 -1
  329. package/src/components/SegmentedControl.parts.tsx +7 -10
  330. package/src/components/Stepper.meta.ts +1 -0
  331. package/src/components/Stepper.parts.tsx +3 -1
  332. package/src/components/Switch.meta.ts +1 -5
  333. package/src/components/TabSet.meta.ts +3 -1
  334. package/src/components/TextArea.meta.ts +1 -5
  335. package/src/components/ToggleButton.meta.ts +1 -6
  336. package/src/components/ToggleButton.tsx +1 -1
  337. package/src/components/Tooltip.meta.ts +13 -2
  338. package/src/components/Tooltip.parts.tsx +215 -158
  339. package/src/components/Tooltip.tsx +2 -2
  340. package/src/components/base/Addon.meta.ts +3 -1
  341. package/src/components/base/ButtonOrLink.parts.tsx +52 -51
  342. package/src/components/base/Checkable.parts.tsx +6 -13
  343. package/src/components/base/Field.parts.tsx +5 -5
  344. package/src/components/base/Portal.tsx +5 -7
  345. package/src/components/base/Render.tsx +37 -15
  346. package/src/components/base/Transition.meta.ts +1 -0
  347. package/src/components/base/Transition.tsx +2 -2
  348. package/src/components/base/index.ts +8 -2
  349. package/src/components/index.ts +1 -2
  350. package/src/hooks/index.ts +1 -0
  351. package/src/hooks/useCSSProp.ts +6 -8
  352. package/src/hooks/useCSSProps.ts +13 -22
  353. package/src/hooks/useCSSPropsPolyfill.ts +15 -23
  354. package/src/hooks/useCSSState.ts +11 -6
  355. package/src/hooks/useEffectWithRefDeps.ts +2 -2
  356. package/src/hooks/useFirstRender.ts +36 -0
  357. package/src/hooks/usePrevious.ts +6 -4
  358. package/src/hooks/useRefWithInit.ts +2 -2
  359. package/src/hooks/useStyleObserver.ts +5 -1
  360. package/src/icons/CalendarDynamicIcon.tsx +16 -6
  361. package/src/icons/CopyInteractiveIcon.tsx +10 -5
  362. package/src/icons/SidebarLeftInteractiveIcon.tsx +9 -5
  363. package/src/icons/SidebarRightInteractiveIcon.tsx +9 -5
  364. package/src/tailwind-plugin.ts +5 -5
  365. package/src/utils/cn.ts +3 -1
  366. package/src/utils/getCSSPropsAttributes.ts +13 -8
  367. package/src/utils/splitProps.ts +9 -9
  368. package/src/utils/trimReactNode.tsx +10 -8
  369. package/dist/components/base/ButtonOrLink.meta.d.ts +0 -2
  370. package/dist/components/base/ButtonOrLink.meta.d.ts.map +0 -1
  371. package/dist/components/base/ButtonOrLink.meta.js +0 -6
  372. package/dist/components/base/ButtonOrLink.meta.js.map +0 -1
  373. 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 } from './Render.tsx'
23
24
 
24
25
  interface LinkComponentObject {
25
26
  component: ElementType
@@ -35,7 +36,7 @@ type LinkComponent =
35
36
  | LinkComponentObject
36
37
  | null
37
38
 
38
- export interface ButtonOrLinkState {
39
+ export type ButtonOrLinkState = {
39
40
  Element: ElementType
40
41
  category: 'button' | 'link' | 'other'
41
42
  role: NonNullable<InternalButtonOrLinkProps['role']>
@@ -61,10 +62,8 @@ export declare namespace InternalButtonOrLinkProps {
61
62
  */
62
63
  inline?: boolean | undefined
63
64
  /** 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) */
65
+ render?: RenderFn<ButtonOrLinkState> | undefined
66
+ /** Custom component to use for rendering links (e.g. Next.js Link) */
68
67
  linkComponent?: LinkComponent | undefined
69
68
  }
70
69
  interface ButtonProps
@@ -121,16 +120,19 @@ interface WithButtonOrLinkContextProps {
121
120
  buttonOrLinkState: ButtonOrLinkState
122
121
  }
123
122
 
124
- const memoizedWithContextComponents = new Map<ElementType, ElementType>()
123
+ type WithContextComponent<T extends ElementType> = (
124
+ props: Merge<ComponentProps<T>, WithButtonOrLinkContextProps>,
125
+ ) => ReactElement
125
126
 
126
- function withContext<T extends ElementType>(Element: T) {
127
- if (memoizedWithContextComponents.has(Element)) {
128
- return memoizedWithContextComponents.get(Element)!
129
- }
130
- const newWithContextComponent = ({
127
+ const memoizedWithContextComponents = new Map<ElementType, WithContextComponent<ElementType>>()
128
+
129
+ function withContext<T extends ElementType>(Element: T): WithContextComponent<T> {
130
+ const cached = memoizedWithContextComponents.get(Element)
131
+ if (cached) return cached
132
+ const newWithContextComponent: WithContextComponent<ElementType> = ({
131
133
  buttonOrLinkState,
132
134
  ...props
133
- }: WithButtonOrLinkContextProps & ComponentProps<T>) => (
135
+ }) => (
134
136
  <ButtonOrLinkContext.Provider value={buttonOrLinkState}>
135
137
  <Element {...(props as ComponentProps<T>)} />
136
138
  </ButtonOrLinkContext.Provider>
@@ -142,7 +144,7 @@ function withContext<T extends ElementType>(Element: T) {
142
144
  const ButtonWithContext = withContext('button')
143
145
  const SpanButtonWithContext = withContext(SpanButton)
144
146
  const AnchorWithContext = withContext('a')
145
- const RenderWithContext = withContext(Render as ElementType<RenderProps>)
147
+ const RenderWithContext = withContext(Render)
146
148
 
147
149
  interface ButtonOrLinkConfigContextValue {
148
150
  onClick:
@@ -187,11 +189,22 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
187
189
  inline = false,
188
190
  linkComponent: passedLinkComponent,
189
191
  render,
190
- onClick,
191
192
  className: passedClassName,
192
193
  children,
193
194
  ...nonBaseProps
194
195
  } = props
196
+ const manuallyDisabledEventProps = {
197
+ onClick: undefined,
198
+ onMouseDown: undefined,
199
+ onMouseUp: undefined,
200
+ onPointerDown: undefined,
201
+ onPointerUp: undefined,
202
+ onTouchStart: undefined,
203
+ onTouchEnd: undefined,
204
+ onKeyDown: undefined,
205
+ onKeyUp: undefined,
206
+ }
207
+
195
208
  const className = cn('gds-button-or-link', passedClassName)
196
209
 
197
210
  if (props.href === undefined) {
@@ -241,7 +254,7 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
241
254
  return { 'aria-checked': checkedOrMixed }
242
255
  })(checked)
243
256
 
244
- let buttonProps: ComponentProps<typeof Element> = {
257
+ const buttonProps: ComponentProps<typeof Element> = {
245
258
  role,
246
259
  type: disabled === 'focusable' ? 'button' : type,
247
260
  disabled: disabled === true,
@@ -250,11 +263,8 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
250
263
  className,
251
264
  children,
252
265
  buttonOrLinkState: state,
253
- }
254
- buttonProps = {
255
- ...buttonProps,
256
- onClick: !disabled ? (onClick as typeof buttonProps.onClick) : undefined,
257
- ...(remainingProps as typeof buttonProps),
266
+ ...(remainingProps as ComponentProps<'button'>),
267
+ ...((disabled === 'focusable' || (disabled && inline)) && manuallyDisabledEventProps),
258
268
  }
259
269
 
260
270
  return render ? render(buttonProps, state) : <Element {...buttonProps} />
@@ -280,26 +290,16 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
280
290
  target,
281
291
  }
282
292
 
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),
293
+ let linkProps: ComponentProps<'a'> = {
294
+ role: disabled || role !== 'link' ? role : undefined,
295
+ href: !disabled ? href : undefined,
296
+ target: !disabled ? target : undefined,
297
+ rel: !disabled ? rel : undefined,
298
+ 'aria-disabled': Boolean(disabled) || undefined,
299
+ className,
300
+ children,
301
+ ...(remainingProps as ComponentProps<'a'>),
302
+ ...(disabled && manuallyDisabledEventProps),
303
303
  }
304
304
 
305
305
  let linkComponent: ElementType | ReactElement | null = null
@@ -425,16 +425,17 @@ function SpanButton({
425
425
  isDisabled: disabled,
426
426
  elementType: 'span',
427
427
  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)
428
+ event.target.dispatchEvent(
429
+ new MouseEvent('click', {
430
+ altKey: event.altKey,
431
+ ctrlKey: event.ctrlKey,
432
+ metaKey: event.metaKey,
433
+ shiftKey: event.shiftKey,
434
+ relatedTarget: event.target,
435
+ bubbles: true,
436
+ cancelable: true,
437
+ }),
438
+ )
438
439
  },
439
440
  onPressStart: (event) => {
440
441
  if (event.pointerType === 'keyboard') setActive(true)
@@ -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
@@ -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
 
@@ -1,31 +1,53 @@
1
1
  'use client'
2
2
 
3
- import type { ComponentProps, ElementType } from 'react'
4
- import { useRender } from '@base-ui/react/use-render'
3
+ import type { ReactElement } from 'react'
4
+ import { useRender, type HTMLProps } from '@base-ui/react/use-render'
5
+ import { objectFromEntries } from 'ts-extras'
5
6
 
6
- export type RenderProps<
7
- T extends ElementType = 'span',
8
- State extends Record<string, unknown> = Record<string, unknown>,
9
- > = ComponentProps<T> & {
10
- render: NonNullable<useRender.ComponentProps<T, State>['render']>
7
+ export type RenderFnProps = HTMLProps
8
+ export type RenderFnState = Record<string, unknown> | undefined
9
+
10
+ export type RenderFn<State extends RenderFnState = undefined, ElementProps = unknown> = (
11
+ renderProps: RenderFnProps,
12
+ state: State,
13
+ ) => ReactElement<ElementProps>
14
+
15
+ /**
16
+ * Type for a `render` prop that accepts either a React element or a render function.
17
+ *
18
+ * - **Element form**: Pass a React element to replace the default tag (e.g., `<strong />`).
19
+ * - **Function form**: Pass a callback `(props, state) => ReactElement` for full control.
20
+ *
21
+ * @template State - The state object passed to the render function.
22
+ * @template ElementProps - Optional constraint on the returned element's props (e.g., `{ disabled?:
23
+ * boolean }`).
24
+ */
25
+ export type RenderProp<State extends RenderFnState = undefined, ElementProps = unknown> =
26
+ | ReactElement<ElementProps>
27
+ | RenderFn<State, ElementProps>
28
+
29
+ export interface RenderProps<State extends RenderFnState = undefined> {
30
+ render: RenderProp<State>
11
31
  state?: State | undefined
32
+ [key: string]: unknown
12
33
  }
13
34
 
14
35
  /**
15
36
  * A utility component that provides polymorphic rendering capabilities. It can render as any HTML
16
37
  * element or React component.
17
38
  */
18
- export function Render<
19
- T extends ElementType = 'span',
20
- State extends Record<string, unknown> = Record<string, unknown>,
21
- >({ render, state, ...props }: RenderProps<T, State>) {
39
+ export function Render<State extends RenderFnState>({
40
+ render,
41
+ state,
42
+ ...props
43
+ }: RenderProps<State>) {
22
44
  return useRender({
23
45
  render,
24
- state,
46
+ state: state !== undefined ? state : (undefined as never),
25
47
  props,
26
48
  // Do not automatically add data attributes for state properties
27
- stateAttributesMapping: Object.fromEntries(
28
- Object.keys(state ?? {}).map((stateProperty) => [stateProperty, (_value) => null] as const),
29
- ) as Record<keyof State, (value: unknown) => null>,
49
+ stateAttributesMapping: objectFromEntries(
50
+ Object.keys(state ?? {}).map((stateProperty) => [stateProperty, () => null] as const),
51
+ ),
30
52
  })
31
53
  }
@@ -1,6 +1,7 @@
1
1
  import { createComponent } from '@graphprotocol/gds-css'
2
2
 
3
3
  export const TransitionMeta = createComponent('Transition', {
4
+ isolate: 'allow-inheritance',
4
5
  vars: {
5
6
  'enter-opacity': '0',
6
7
  'enter-scale': '1',
@@ -108,7 +108,7 @@ export function Transition({
108
108
  ref={statePassedRef}
109
109
  data-layout={layout}
110
110
  className={cn(
111
- `gds-transition isolate
111
+ `gds-transition
112
112
  u:state-[transition=idle]
113
113
  u:data-[layout=block]:block
114
114
  u:data-[layout=flex-col]:flex
@@ -130,7 +130,7 @@ export function Transition({
130
130
  data-layout={layout}
131
131
  data-animate-size={animateSize || undefined}
132
132
  className={cn(
133
- `gds-transition isolate
133
+ `gds-transition
134
134
  u:state-[transition=idle]
135
135
  u:has-[>*>*>[inert]]:state-[transition=running]
136
136
  u:has-[>*>*>[inert]]:data-[animate-size=clip]:overflow-clip
@@ -7,7 +7,6 @@ export {
7
7
  type ButtonOrLinkProps,
8
8
  type ButtonOrLinkState,
9
9
  } from './ButtonOrLink.tsx'
10
- export { ButtonOrLinkMeta } from './ButtonOrLink.meta.ts'
11
10
  export {
12
11
  Checkable,
13
12
  type CheckableLabelProps,
@@ -19,6 +18,13 @@ export { Field, type FieldProps, type FieldState } from './Field.tsx'
19
18
  export { FieldMeta } from './Field.meta.ts'
20
19
  export { MaybeButtonOrLink, type MaybeButtonOrLinkProps } from './MaybeButtonOrLink.tsx'
21
20
  export { Portal } from './Portal.tsx'
22
- export { Render, type RenderProps } from './Render.tsx'
21
+ export {
22
+ Render,
23
+ type RenderFnProps,
24
+ type RenderFnState,
25
+ type RenderFn,
26
+ type RenderProp,
27
+ type RenderProps,
28
+ } from './Render.tsx'
23
29
  export { Transition, type TransitionProps } from './Transition.tsx'
24
30
  export { TransitionMeta } from './Transition.meta.ts'
@@ -97,8 +97,7 @@ export { ToggleButton, type ToggleButtonProps } from './ToggleButton.tsx'
97
97
  export { ToggleButtonMeta } from './ToggleButton.meta.ts'
98
98
  export {
99
99
  Tooltip,
100
- useCollectTooltip,
101
- useCollectedTooltip,
100
+ useTooltipCollector,
102
101
  type TooltipProps,
103
102
  type TooltipCollectorProps,
104
103
  type TooltipContentProps,
@@ -12,6 +12,7 @@ export { useCSSProps } from './useCSSProps.ts'
12
12
  export { useCSSPropsPolyfill } from './useCSSPropsPolyfill.ts'
13
13
  export { useCSSState } from './useCSSState.ts'
14
14
  export { useEffectWithRefDeps } from './useEffectWithRefDeps.ts'
15
+ export { useFirstRender } from './useFirstRender.ts'
15
16
  export { useForceRerender } from './useForceRerender.ts'
16
17
  export { useMapWithInit } from './useMapWithInit.ts'
17
18
  export {
@@ -21,17 +21,15 @@ export function useCSSProp<
21
21
  const { ref: passedRef } = options
22
22
  const elementRef = useRef<HTMLElement>(null)
23
23
  const callbackRef: RefCallback<HTMLElement> | null = useMergedRefs(elementRef, passedRef)
24
- const prop = component.getCSSPropByName(propName)
24
+ const cssProp = component.getCSSPropByName(propName)
25
25
 
26
- const getCSSProp = useCallback(async () => {
26
+ const getCSSPropValue = useCallback(async () => {
27
27
  if (typeof window === 'undefined' || !elementRef.current) return null
28
28
  const element = elementRef.current
29
29
  const computedStyle = await styleScheduler.getComputedStyle(element)
30
- const rawValue = computedStyle.getPropertyValue(
31
- `--gds-${component.kebabName}-${prop.kebabName}`,
32
- )
33
- return parseCSSPropValue(prop, rawValue) as CSSPropType<ComponentCSSPropsConfig<C>[P]>
34
- }, [component, prop])
30
+ const rawValue = computedStyle.getPropertyValue(cssProp.cssProperty)
31
+ return parseCSSPropValue(cssProp, rawValue) as CSSPropType<ComponentCSSPropsConfig<C>[P]>
32
+ }, [cssProp])
35
33
 
36
- return [callbackRef, getCSSProp] as const
34
+ return [callbackRef, getCSSPropValue] as const
37
35
  }
@@ -1,5 +1,5 @@
1
1
  import type { Ref } from 'react'
2
- import { objectEntries } from 'ts-extras'
2
+ import { objectKeys } from 'ts-extras'
3
3
 
4
4
  import {
5
5
  parseCSSPropValue,
@@ -22,48 +22,39 @@ export type PropValues<P extends PassedValues<GDSComponent>> = {
22
22
 
23
23
  /**
24
24
  * Hook to observe and track CSS prop values from the DOM. Returns a callback ref, a map of prop
25
- * values that updates when CSS properties change, and metadata about each prop.
25
+ * values that updates when CSS properties change, and the array of CSS props.
26
26
  */
27
27
  export function useCSSProps<C extends GDSComponent, P extends PassedValues<C>>(
28
28
  component: C,
29
29
  passedValues: P,
30
30
  options: {
31
31
  ref?: Ref<HTMLElement> | undefined
32
- disabled?: boolean
32
+ disabled?: boolean | undefined
33
33
  } = {},
34
34
  ) {
35
35
  const { ref, disabled = false } = options
36
36
 
37
- const props = useRefWithInit(() =>
38
- objectEntries(passedValues).map(([propName, passedValue]) => {
39
- const cssProp = component.getCSSPropByName(propName)
40
- return {
41
- name: propName,
42
- passedValue,
43
- cssProp,
44
- cssProperty: `--gds-${component.kebabName}-${cssProp.kebabName}`,
45
- polyfillAttribute: `data-gds-prop-polyfill-${cssProp.kebabName}`,
46
- }
47
- }),
37
+ const cssProps = useRefWithInit(() =>
38
+ objectKeys(passedValues).map((propName) => component.getCSSPropByName(propName)),
48
39
  ).current
49
40
 
50
41
  const propValues = useMapWithInit(() =>
51
- props.map((prop) => {
42
+ cssProps.map((cssProp) => {
52
43
  // Using the initial value for missing passed values could be wrong because it can be overridden in CSS, but it's just for the first render
53
- const initialValue =
54
- prop.passedValue !== undefined ? prop.passedValue : prop.cssProp.initialValue
55
- return [prop.name, initialValue]
44
+ const passedValue = passedValues[cssProp.name]
45
+ const initialValue = passedValue !== undefined ? passedValue : cssProp.initialValue
46
+ return [cssProp.name, initialValue]
56
47
  }),
57
48
  )
58
49
 
59
- const cssProperties = useRefWithInit(() => props.map((prop) => prop.cssProperty)).current
50
+ const cssProperties = useRefWithInit(() => cssProps.map((cssProp) => cssProp.cssProperty)).current
60
51
 
61
52
  const callbackRef = useStyleObserver(
62
53
  cssProperties,
63
54
  (records) => {
64
55
  for (const record of records) {
65
- const prop = props.find((prop) => prop.cssProperty === record.property)!
66
- const value = parseCSSPropValue(prop.cssProp, record.value)
56
+ const prop = cssProps.find((prop) => prop.cssProperty === record.property)!
57
+ const value = parseCSSPropValue(prop, record.value)
67
58
  if (propValues.get(prop.name) !== value) {
68
59
  propValues.set(prop.name, value)
69
60
  }
@@ -73,5 +64,5 @@ export function useCSSProps<C extends GDSComponent, P extends PassedValues<C>>(
73
64
  { ...(ref !== undefined && { ref }), immediate: true, disabled },
74
65
  )
75
66
 
76
- return [callbackRef, Object.fromEntries(propValues) as PropValues<P>, props] as const
67
+ return [callbackRef, Object.fromEntries(propValues) as PropValues<P>, cssProps] as const
77
68
  }
@@ -1,4 +1,4 @@
1
- import { useLayoutEffect, useRef, type Ref, type RefCallback } from 'react'
1
+ import type { Ref, RefCallback } from 'react'
2
2
 
3
3
  import {
4
4
  getCSSPropRawValue,
@@ -9,7 +9,7 @@ import {
9
9
  } from '@graphprotocol/gds-css'
10
10
 
11
11
  import { useCSSProps, type PassedValues, type PropValues } from './useCSSProps.ts'
12
- import { useForceRerender } from './useForceRerender.ts'
12
+ import { useFirstRender } from './useFirstRender.ts'
13
13
 
14
14
  type ExtractPolyfillValues<P extends CSSPropsConfig> = {
15
15
  [K in keyof P as P[K]['type'] extends 'values' ? K : never]: CSSPropType<P[K]> | undefined
@@ -68,19 +68,21 @@ export function useCSSPropsPolyfill<
68
68
  const allPassedValues = (() => {
69
69
  if (!returnPropValues) return passedValues
70
70
  if (returnPropValues === true) return passedValues
71
- const merged = { ...passedValues }
72
- for (const [key, value] of Object.entries(returnPropValues)) {
73
- if (key in passedValues && passedValues[key as keyof typeof passedValues] !== value) {
71
+ const passed = passedValues as Record<string, unknown>
72
+ const merged = { ...passed }
73
+ for (const key of Object.keys(returnPropValues)) {
74
+ const value = returnPropValues[key]
75
+ if (key in passedValues && passed[key] !== value) {
74
76
  throw new Error(
75
- `[useCSSPropsPolyfill] Conflicting values for prop \`${key}\`: ${passedValues[key as keyof typeof passedValues]} vs ${value}`,
77
+ `[useCSSPropsPolyfill] Conflicting values for prop \`${key}\`: ${String(passed[key])} vs ${value}`,
76
78
  )
77
79
  }
78
- merged[key as keyof typeof merged] = value as (typeof merged)[keyof typeof merged]
80
+ merged[key] = value
79
81
  }
80
- return merged
82
+ return merged as typeof passedValues
81
83
  })()
82
84
 
83
- const [callbackRef, propValues, props] = useCSSProps(component, allPassedValues, {
85
+ const [callbackRef, propValues, cssProps] = useCSSProps(component, allPassedValues, {
84
86
  ref,
85
87
  disabled: !polyfillEnabled && !returnPropValues,
86
88
  })
@@ -92,30 +94,20 @@ export function useCSSPropsPolyfill<
92
94
  * to immediately rerender in browsers that support style queries); unfortunately, that would
93
95
  * cause a flash of missing styles in browsers that need the polyfill.
94
96
  */
95
- const firstRender = useRef(true)
97
+ const firstRender = useFirstRender({ immediatelyRerender: !polyfillEnabled })
96
98
  const polyfillAttributes =
97
- polyfillEnabled || firstRender.current
99
+ polyfillEnabled || firstRender
98
100
  ? Object.fromEntries(
99
- props
101
+ cssProps
100
102
  .filter((prop) => prop.name in passedValues)
101
103
  .map((prop) => {
102
104
  const value = propValues[prop.name as keyof typeof propValues]
103
- const rawValue = getCSSPropRawValue(prop.cssProp, value)
105
+ const rawValue = getCSSPropRawValue(prop, value)
104
106
  return [prop.polyfillAttribute, rawValue]
105
107
  }),
106
108
  )
107
109
  : {}
108
110
 
109
- // If the polyfill is not needed, rerender to remove the polyfill attributes
110
- const [rerender] = useForceRerender()
111
- useLayoutEffect(() => {
112
- firstRender.current = false
113
- if (!polyfillEnabled) {
114
- rerender()
115
- }
116
- // oxlint-disable-next-line exhaustive-deps
117
- }, [])
118
-
119
111
  if (!returnPropValues) {
120
112
  return [callbackRef, polyfillAttributes] as const
121
113
  }
@@ -56,15 +56,17 @@ export function useCSSState<
56
56
 
57
57
  const variables = useRefWithInit(() =>
58
58
  Object.keys(variableInitialValues).map((variableName) => {
59
- const defaultValue =
60
- variableName in cssStateVariables
61
- ? cssStateVariables[variableName as CSSStateVariableName].defaultValue
62
- : undefined
59
+ const isArbitrary = !(variableName in cssStateVariables)
60
+ const defaultValue = !isArbitrary
61
+ ? cssStateVariables[variableName as CSSStateVariableName].defaultValue
62
+ : undefined
63
63
  return {
64
64
  name: variableName,
65
65
  defaultValue,
66
66
  initialValue: variableInitialValues[variableName as keyof T] ?? defaultValue,
67
- observedProperty: `--gds-observed-${variableName}`,
67
+ observedProperty: isArbitrary
68
+ ? `--gds-state-${variableName}`
69
+ : `--gds-observed-${variableName}`,
68
70
  exposedProperty: `--gds-exposed-${variableName}`,
69
71
  exposedAttribute: `data-gds-exposed-${variableName}`,
70
72
  polyfillAttribute: `data-gds-state-polyfill-${variableName}`,
@@ -105,7 +107,10 @@ export function useCSSState<
105
107
  for (const record of records) {
106
108
  if (propertyValues.get(record.property) !== record.value) {
107
109
  propertyValues.set(record.property, record.value)
108
- if (record.property.startsWith('--gds-observed-')) {
110
+ if (
111
+ record.property.startsWith('--gds-state-') ||
112
+ record.property.startsWith('--gds-observed-')
113
+ ) {
109
114
  statePropertiesChanged = true
110
115
  }
111
116
  }