@graphprotocol/gds-react 0.1.1 → 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 (390) 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 +7 -11
  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 +15 -23
  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 +17 -12
  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.js +1 -1
  35. package/dist/components/Card.js.map +1 -1
  36. package/dist/components/Card.meta.d.ts +1 -2
  37. package/dist/components/Card.meta.d.ts.map +1 -1
  38. package/dist/components/Card.meta.js +1 -0
  39. package/dist/components/Card.meta.js.map +1 -1
  40. package/dist/components/Checkbox.meta.d.ts +1 -6
  41. package/dist/components/Checkbox.meta.d.ts.map +1 -1
  42. package/dist/components/Checkbox.meta.js +1 -5
  43. package/dist/components/Checkbox.meta.js.map +1 -1
  44. package/dist/components/Chip.d.ts +6 -0
  45. package/dist/components/Chip.d.ts.map +1 -0
  46. package/dist/components/Chip.js +5 -0
  47. package/dist/components/Chip.js.map +1 -0
  48. package/dist/components/Chip.meta.d.ts +15 -0
  49. package/dist/components/Chip.meta.d.ts.map +1 -0
  50. package/dist/components/Chip.meta.js +22 -0
  51. package/dist/components/Chip.meta.js.map +1 -0
  52. package/dist/components/Chip.parts.d.ts +52 -0
  53. package/dist/components/Chip.parts.d.ts.map +1 -0
  54. package/dist/components/Chip.parts.js +114 -0
  55. package/dist/components/Chip.parts.js.map +1 -0
  56. package/dist/components/Cluster.meta.d.ts +8 -2
  57. package/dist/components/Cluster.meta.d.ts.map +1 -1
  58. package/dist/components/CodeBlock.d.ts +1 -1
  59. package/dist/components/CodeBlock.meta.d.ts +2 -4
  60. package/dist/components/CodeBlock.meta.d.ts.map +1 -1
  61. package/dist/components/CodeBlock.parts.d.ts +6 -7
  62. package/dist/components/CodeBlock.parts.d.ts.map +1 -1
  63. package/dist/components/CodeBlock.parts.js +28 -10
  64. package/dist/components/CodeBlock.parts.js.map +1 -1
  65. package/dist/components/CodeInline.js +3 -3
  66. package/dist/components/CodeInline.meta.d.ts +1 -1
  67. package/dist/components/CodeInline.meta.d.ts.map +1 -1
  68. package/dist/components/CopyButton.d.ts.map +1 -1
  69. package/dist/components/CopyButton.js +2 -4
  70. package/dist/components/CopyButton.js.map +1 -1
  71. package/dist/components/CopyButton.meta.d.ts +1 -12
  72. package/dist/components/CopyButton.meta.d.ts.map +1 -1
  73. package/dist/components/CopyButton.meta.js +1 -6
  74. package/dist/components/CopyButton.meta.js.map +1 -1
  75. package/dist/components/CurrencyInput.meta.d.ts +1 -6
  76. package/dist/components/CurrencyInput.meta.d.ts.map +1 -1
  77. package/dist/components/CurrencyInput.meta.js +1 -5
  78. package/dist/components/CurrencyInput.meta.js.map +1 -1
  79. package/dist/components/DescriptionList.meta.d.ts +2 -5
  80. package/dist/components/DescriptionList.meta.d.ts.map +1 -1
  81. package/dist/components/DescriptionList.parts.d.ts +3 -0
  82. package/dist/components/DescriptionList.parts.d.ts.map +1 -1
  83. package/dist/components/DescriptionList.parts.js +2 -1
  84. package/dist/components/DescriptionList.parts.js.map +1 -1
  85. package/dist/components/Divider.meta.d.ts +1 -3
  86. package/dist/components/Divider.meta.d.ts.map +1 -1
  87. package/dist/components/Icon.js +4 -4
  88. package/dist/components/Icon.js.map +1 -1
  89. package/dist/components/Icon.meta.d.ts +0 -2
  90. package/dist/components/Icon.meta.d.ts.map +1 -1
  91. package/dist/components/Icon.meta.js +1 -0
  92. package/dist/components/Icon.meta.js.map +1 -1
  93. package/dist/components/Input.d.ts +5 -4
  94. package/dist/components/Input.d.ts.map +1 -1
  95. package/dist/components/Input.js +1 -0
  96. package/dist/components/Input.js.map +1 -1
  97. package/dist/components/Input.meta.d.ts +1 -6
  98. package/dist/components/Input.meta.d.ts.map +1 -1
  99. package/dist/components/Input.meta.js +1 -5
  100. package/dist/components/Input.meta.js.map +1 -1
  101. package/dist/components/Keyboard.js +1 -1
  102. package/dist/components/Keyboard.meta.d.ts +0 -1
  103. package/dist/components/Keyboard.meta.d.ts.map +1 -1
  104. package/dist/components/Label.meta.d.ts +1 -3
  105. package/dist/components/Label.meta.d.ts.map +1 -1
  106. package/dist/components/Link.d.ts +1 -1
  107. package/dist/components/Link.d.ts.map +1 -1
  108. package/dist/components/Link.js +1 -2
  109. package/dist/components/Link.js.map +1 -1
  110. package/dist/components/Link.meta.d.ts +1 -2
  111. package/dist/components/Link.meta.d.ts.map +1 -1
  112. package/dist/components/Link.meta.js +1 -0
  113. package/dist/components/Link.meta.js.map +1 -1
  114. package/dist/components/Menu.meta.d.ts +31 -2
  115. package/dist/components/Menu.meta.d.ts.map +1 -1
  116. package/dist/components/Menu.meta.js +39 -1
  117. package/dist/components/Menu.meta.js.map +1 -1
  118. package/dist/components/Menu.parts.d.ts +23 -32
  119. package/dist/components/Menu.parts.d.ts.map +1 -1
  120. package/dist/components/Menu.parts.js +284 -303
  121. package/dist/components/Menu.parts.js.map +1 -1
  122. package/dist/components/Modal.d.ts +1 -1
  123. package/dist/components/Modal.meta.d.ts +1 -3
  124. package/dist/components/Modal.meta.d.ts.map +1 -1
  125. package/dist/components/Modal.meta.js +1 -1
  126. package/dist/components/Modal.meta.js.map +1 -1
  127. package/dist/components/Modal.parts.d.ts +14 -15
  128. package/dist/components/Modal.parts.d.ts.map +1 -1
  129. package/dist/components/Modal.parts.js +36 -32
  130. package/dist/components/Modal.parts.js.map +1 -1
  131. package/dist/components/OTCInput.js +1 -1
  132. package/dist/components/OTCInput.meta.d.ts +1 -6
  133. package/dist/components/OTCInput.meta.d.ts.map +1 -1
  134. package/dist/components/OTCInput.meta.js +1 -5
  135. package/dist/components/OTCInput.meta.js.map +1 -1
  136. package/dist/components/Radio.meta.d.ts +1 -6
  137. package/dist/components/Radio.meta.d.ts.map +1 -1
  138. package/dist/components/Radio.meta.js +1 -5
  139. package/dist/components/Radio.meta.js.map +1 -1
  140. package/dist/components/Search.meta.d.ts +1 -3
  141. package/dist/components/Search.meta.d.ts.map +1 -1
  142. package/dist/components/SegmentedControl.meta.d.ts +2 -3
  143. package/dist/components/SegmentedControl.meta.d.ts.map +1 -1
  144. package/dist/components/SegmentedControl.meta.js +3 -1
  145. package/dist/components/SegmentedControl.meta.js.map +1 -1
  146. package/dist/components/SegmentedControl.parts.d.ts.map +1 -1
  147. package/dist/components/SegmentedControl.parts.js +15 -31
  148. package/dist/components/SegmentedControl.parts.js.map +1 -1
  149. package/dist/components/Status.meta.d.ts +0 -2
  150. package/dist/components/Status.meta.d.ts.map +1 -1
  151. package/dist/components/Stepper.meta.d.ts +1 -2
  152. package/dist/components/Stepper.meta.d.ts.map +1 -1
  153. package/dist/components/Stepper.meta.js +1 -0
  154. package/dist/components/Stepper.meta.js.map +1 -1
  155. package/dist/components/Stepper.parts.d.ts.map +1 -1
  156. package/dist/components/Stepper.parts.js +1 -1
  157. package/dist/components/Stepper.parts.js.map +1 -1
  158. package/dist/components/Switch.meta.d.ts +1 -6
  159. package/dist/components/Switch.meta.d.ts.map +1 -1
  160. package/dist/components/Switch.meta.js +1 -5
  161. package/dist/components/Switch.meta.js.map +1 -1
  162. package/dist/components/TabSet.meta.d.ts +2 -5
  163. package/dist/components/TabSet.meta.d.ts.map +1 -1
  164. package/dist/components/TabSet.meta.js +3 -1
  165. package/dist/components/TabSet.meta.js.map +1 -1
  166. package/dist/components/TabSet.parts.js +1 -1
  167. package/dist/components/Tag.meta.d.ts +0 -2
  168. package/dist/components/Tag.meta.d.ts.map +1 -1
  169. package/dist/components/TextArea.meta.d.ts +1 -6
  170. package/dist/components/TextArea.meta.d.ts.map +1 -1
  171. package/dist/components/TextArea.meta.js +1 -5
  172. package/dist/components/TextArea.meta.js.map +1 -1
  173. package/dist/components/ToggleButton.d.ts +0 -2
  174. package/dist/components/ToggleButton.d.ts.map +1 -1
  175. package/dist/components/ToggleButton.js +2 -2
  176. package/dist/components/ToggleButton.js.map +1 -1
  177. package/dist/components/ToggleButton.meta.d.ts +1 -12
  178. package/dist/components/ToggleButton.meta.d.ts.map +1 -1
  179. package/dist/components/ToggleButton.meta.js +1 -6
  180. package/dist/components/ToggleButton.meta.js.map +1 -1
  181. package/dist/components/Tooltip.d.ts +2 -2
  182. package/dist/components/Tooltip.d.ts.map +1 -1
  183. package/dist/components/Tooltip.js +2 -2
  184. package/dist/components/Tooltip.js.map +1 -1
  185. package/dist/components/Tooltip.meta.d.ts +12 -7
  186. package/dist/components/Tooltip.meta.d.ts.map +1 -1
  187. package/dist/components/Tooltip.meta.js +13 -2
  188. package/dist/components/Tooltip.meta.js.map +1 -1
  189. package/dist/components/Tooltip.parts.d.ts +20 -20
  190. package/dist/components/Tooltip.parts.d.ts.map +1 -1
  191. package/dist/components/Tooltip.parts.js +129 -88
  192. package/dist/components/Tooltip.parts.js.map +1 -1
  193. package/dist/components/base/Addon.meta.d.ts +1 -1
  194. package/dist/components/base/Addon.meta.d.ts.map +1 -1
  195. package/dist/components/base/Addon.meta.js +3 -1
  196. package/dist/components/base/Addon.meta.js.map +1 -1
  197. package/dist/components/base/ButtonOrLink.d.ts +1 -1
  198. package/dist/components/base/ButtonOrLink.parts.d.ts +14 -10
  199. package/dist/components/base/ButtonOrLink.parts.d.ts.map +1 -1
  200. package/dist/components/base/ButtonOrLink.parts.js +47 -47
  201. package/dist/components/base/ButtonOrLink.parts.js.map +1 -1
  202. package/dist/components/base/Checkable.meta.d.ts +1 -2
  203. package/dist/components/base/Checkable.meta.d.ts.map +1 -1
  204. package/dist/components/base/Checkable.parts.d.ts +6 -6
  205. package/dist/components/base/Checkable.parts.d.ts.map +1 -1
  206. package/dist/components/base/Checkable.parts.js +2 -2
  207. package/dist/components/base/Checkable.parts.js.map +1 -1
  208. package/dist/components/base/Field.meta.d.ts +1 -2
  209. package/dist/components/base/Field.meta.d.ts.map +1 -1
  210. package/dist/components/base/Field.parts.d.ts +5 -4
  211. package/dist/components/base/Field.parts.d.ts.map +1 -1
  212. package/dist/components/base/Field.parts.js +1 -1
  213. package/dist/components/base/Field.parts.js.map +1 -1
  214. package/dist/components/base/MaybeButtonOrLink.d.ts +1 -1
  215. package/dist/components/base/MaybeButtonOrLink.d.ts.map +1 -1
  216. package/dist/components/base/Portal.d.ts +1 -1
  217. package/dist/components/base/Portal.d.ts.map +1 -1
  218. package/dist/components/base/Portal.js +3 -6
  219. package/dist/components/base/Portal.js.map +1 -1
  220. package/dist/components/base/Render.d.ts +21 -6
  221. package/dist/components/base/Render.d.ts.map +1 -1
  222. package/dist/components/base/Render.js +3 -2
  223. package/dist/components/base/Render.js.map +1 -1
  224. package/dist/components/base/Transition.js +2 -2
  225. package/dist/components/base/Transition.meta.d.ts +1 -1
  226. package/dist/components/base/Transition.meta.d.ts.map +1 -1
  227. package/dist/components/base/Transition.meta.js +1 -0
  228. package/dist/components/base/Transition.meta.js.map +1 -1
  229. package/dist/components/base/index.d.ts +1 -2
  230. package/dist/components/base/index.d.ts.map +1 -1
  231. package/dist/components/base/index.js +1 -2
  232. package/dist/components/base/index.js.map +1 -1
  233. package/dist/components/index.d.ts +3 -1
  234. package/dist/components/index.d.ts.map +1 -1
  235. package/dist/components/index.js +3 -1
  236. package/dist/components/index.js.map +1 -1
  237. package/dist/hooks/index.d.ts +1 -0
  238. package/dist/hooks/index.d.ts.map +1 -1
  239. package/dist/hooks/index.js +1 -0
  240. package/dist/hooks/index.js.map +1 -1
  241. package/dist/hooks/useCSSProp.d.ts.map +1 -1
  242. package/dist/hooks/useCSSProp.js +6 -6
  243. package/dist/hooks/useCSSProp.js.map +1 -1
  244. package/dist/hooks/useCSSProps.d.ts +11 -13
  245. package/dist/hooks/useCSSProps.d.ts.map +1 -1
  246. package/dist/hooks/useCSSProps.js +11 -19
  247. package/dist/hooks/useCSSProps.js.map +1 -1
  248. package/dist/hooks/useCSSPropsPolyfill.d.ts +1 -1
  249. package/dist/hooks/useCSSPropsPolyfill.d.ts.map +1 -1
  250. package/dist/hooks/useCSSPropsPolyfill.js +12 -20
  251. package/dist/hooks/useCSSPropsPolyfill.js.map +1 -1
  252. package/dist/hooks/useCSSState.d.ts.map +1 -1
  253. package/dist/hooks/useCSSState.js +7 -3
  254. package/dist/hooks/useCSSState.js.map +1 -1
  255. package/dist/hooks/useEffectWithRefDeps.d.ts +2 -2
  256. package/dist/hooks/useEffectWithRefDeps.d.ts.map +1 -1
  257. package/dist/hooks/useEffectWithRefDeps.js +1 -1
  258. package/dist/hooks/useEffectWithRefDeps.js.map +1 -1
  259. package/dist/hooks/useFirstRender.d.ts +14 -0
  260. package/dist/hooks/useFirstRender.d.ts.map +1 -0
  261. package/dist/hooks/useFirstRender.js +20 -0
  262. package/dist/hooks/useFirstRender.js.map +1 -0
  263. package/dist/hooks/useGDS.d.ts +1 -1
  264. package/dist/hooks/usePrevious.d.ts +6 -4
  265. package/dist/hooks/usePrevious.d.ts.map +1 -1
  266. package/dist/hooks/usePrevious.js +6 -4
  267. package/dist/hooks/usePrevious.js.map +1 -1
  268. package/dist/hooks/useRefWithInit.d.ts +2 -2
  269. package/dist/hooks/useRefWithInit.d.ts.map +1 -1
  270. package/dist/hooks/useRefWithInit.js.map +1 -1
  271. package/dist/hooks/useStyleObserver.d.ts +2 -2
  272. package/dist/hooks/useStyleObserver.d.ts.map +1 -1
  273. package/dist/hooks/useStyleObserver.js.map +1 -1
  274. package/dist/icons/CalendarDynamicIcon.d.ts +8 -5
  275. package/dist/icons/CalendarDynamicIcon.d.ts.map +1 -1
  276. package/dist/icons/CalendarDynamicIcon.js +5 -2
  277. package/dist/icons/CalendarDynamicIcon.js.map +1 -1
  278. package/dist/icons/CopyInteractiveIcon.d.ts +5 -4
  279. package/dist/icons/CopyInteractiveIcon.d.ts.map +1 -1
  280. package/dist/icons/CopyInteractiveIcon.js +2 -2
  281. package/dist/icons/CopyInteractiveIcon.js.map +1 -1
  282. package/dist/icons/SidebarLeftInteractiveIcon.d.ts +4 -3
  283. package/dist/icons/SidebarLeftInteractiveIcon.d.ts.map +1 -1
  284. package/dist/icons/SidebarLeftInteractiveIcon.js +2 -2
  285. package/dist/icons/SidebarLeftInteractiveIcon.js.map +1 -1
  286. package/dist/icons/SidebarRightInteractiveIcon.d.ts +4 -3
  287. package/dist/icons/SidebarRightInteractiveIcon.d.ts.map +1 -1
  288. package/dist/icons/SidebarRightInteractiveIcon.js +2 -2
  289. package/dist/icons/SidebarRightInteractiveIcon.js.map +1 -1
  290. package/dist/tailwind-plugin.d.ts.map +1 -1
  291. package/dist/tailwind-plugin.js +8 -5
  292. package/dist/tailwind-plugin.js.map +1 -1
  293. package/dist/utils/cn.d.ts +3 -1
  294. package/dist/utils/cn.d.ts.map +1 -1
  295. package/dist/utils/cn.js +3 -1
  296. package/dist/utils/cn.js.map +1 -1
  297. package/dist/utils/getCSSPropsAttributes.d.ts +10 -3
  298. package/dist/utils/getCSSPropsAttributes.d.ts.map +1 -1
  299. package/dist/utils/getCSSPropsAttributes.js +4 -5
  300. package/dist/utils/getCSSPropsAttributes.js.map +1 -1
  301. package/dist/utils/splitProps.d.ts +1 -4
  302. package/dist/utils/splitProps.d.ts.map +1 -1
  303. package/dist/utils/splitProps.js +2 -7
  304. package/dist/utils/splitProps.js.map +1 -1
  305. package/dist/utils/trimReactNode.d.ts +10 -8
  306. package/dist/utils/trimReactNode.d.ts.map +1 -1
  307. package/dist/utils/trimReactNode.js +10 -8
  308. package/dist/utils/trimReactNode.js.map +1 -1
  309. package/package.json +17 -17
  310. package/src/GDSProvider.tsx +11 -9
  311. package/src/components/Address.tsx +2 -2
  312. package/src/components/Avatar.tsx +10 -11
  313. package/src/components/Breadcrumbs.meta.ts +3 -1
  314. package/src/components/Breadcrumbs.parts.tsx +18 -30
  315. package/src/components/Button.tsx +27 -13
  316. package/src/components/ButtonGroup.meta.ts +8 -0
  317. package/src/components/ButtonGroup.tsx +1 -5
  318. package/src/components/Card.meta.ts +1 -0
  319. package/src/components/Card.tsx +1 -1
  320. package/src/components/Checkbox.meta.ts +1 -5
  321. package/src/components/Chip.meta.ts +23 -0
  322. package/src/components/Chip.parts.tsx +319 -0
  323. package/src/components/Chip.tsx +7 -0
  324. package/src/components/CodeBlock.parts.tsx +75 -50
  325. package/src/components/CodeInline.tsx +3 -3
  326. package/src/components/CopyButton.meta.ts +1 -6
  327. package/src/components/CopyButton.tsx +3 -4
  328. package/src/components/CurrencyInput.meta.ts +1 -5
  329. package/src/components/DescriptionList.parts.tsx +2 -1
  330. package/src/components/Icon.meta.ts +1 -0
  331. package/src/components/Icon.tsx +4 -4
  332. package/src/components/Input.meta.ts +1 -5
  333. package/src/components/Input.tsx +5 -6
  334. package/src/components/Keyboard.tsx +1 -1
  335. package/src/components/Link.meta.ts +1 -0
  336. package/src/components/Link.tsx +2 -3
  337. package/src/components/Menu.meta.ts +39 -1
  338. package/src/components/Menu.parts.tsx +553 -549
  339. package/src/components/Modal.meta.ts +1 -1
  340. package/src/components/Modal.parts.tsx +67 -68
  341. package/src/components/OTCInput.meta.ts +1 -5
  342. package/src/components/OTCInput.tsx +1 -1
  343. package/src/components/Radio.meta.ts +1 -5
  344. package/src/components/SegmentedControl.meta.ts +3 -1
  345. package/src/components/SegmentedControl.parts.tsx +40 -44
  346. package/src/components/Stepper.meta.ts +1 -0
  347. package/src/components/Stepper.parts.tsx +3 -1
  348. package/src/components/Switch.meta.ts +1 -5
  349. package/src/components/TabSet.meta.ts +3 -1
  350. package/src/components/TabSet.parts.tsx +1 -1
  351. package/src/components/TextArea.meta.ts +1 -5
  352. package/src/components/ToggleButton.meta.ts +1 -6
  353. package/src/components/ToggleButton.tsx +1 -3
  354. package/src/components/Tooltip.meta.ts +13 -2
  355. package/src/components/Tooltip.parts.tsx +215 -159
  356. package/src/components/Tooltip.tsx +2 -2
  357. package/src/components/base/Addon.meta.ts +3 -1
  358. package/src/components/base/ButtonOrLink.parts.tsx +91 -73
  359. package/src/components/base/Checkable.parts.tsx +6 -13
  360. package/src/components/base/Field.parts.tsx +5 -5
  361. package/src/components/base/Portal.tsx +5 -7
  362. package/src/components/base/Render.tsx +37 -15
  363. package/src/components/base/Transition.meta.ts +1 -0
  364. package/src/components/base/Transition.tsx +2 -2
  365. package/src/components/base/index.ts +8 -2
  366. package/src/components/index.ts +3 -2
  367. package/src/hooks/index.ts +1 -0
  368. package/src/hooks/useCSSProp.ts +6 -8
  369. package/src/hooks/useCSSProps.ts +13 -22
  370. package/src/hooks/useCSSPropsPolyfill.ts +15 -23
  371. package/src/hooks/useCSSState.ts +11 -6
  372. package/src/hooks/useEffectWithRefDeps.ts +2 -2
  373. package/src/hooks/useFirstRender.ts +36 -0
  374. package/src/hooks/usePrevious.ts +6 -4
  375. package/src/hooks/useRefWithInit.ts +2 -2
  376. package/src/hooks/useStyleObserver.ts +5 -1
  377. package/src/icons/CalendarDynamicIcon.tsx +16 -6
  378. package/src/icons/CopyInteractiveIcon.tsx +10 -5
  379. package/src/icons/SidebarLeftInteractiveIcon.tsx +9 -5
  380. package/src/icons/SidebarRightInteractiveIcon.tsx +9 -5
  381. package/src/tailwind-plugin.ts +8 -5
  382. package/src/utils/cn.ts +3 -1
  383. package/src/utils/getCSSPropsAttributes.ts +13 -8
  384. package/src/utils/splitProps.ts +9 -9
  385. package/src/utils/trimReactNode.tsx +10 -8
  386. package/dist/components/base/ButtonOrLink.meta.d.ts +0 -2
  387. package/dist/components/base/ButtonOrLink.meta.d.ts.map +0 -1
  388. package/dist/components/base/ButtonOrLink.meta.js +0 -6
  389. package/dist/components/base/ButtonOrLink.meta.js.map +0 -1
  390. 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,26 +62,31 @@ 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
71
- extends BaseProps, DisableableProps, Omit<ComponentProps<'button'>, 'disabled'> {
70
+ extends
71
+ BaseProps,
72
+ DisableableProps,
73
+ Omit<ComponentProps<'button'>, 'defaultValue' | 'disabled'> {
72
74
  href?: undefined
73
75
  target?: undefined
74
76
  checked?: undefined
77
+ defaultChecked?: undefined
75
78
  }
76
- interface ToggleButtonProps extends Omit<ButtonProps, 'checked'> {
77
- /** Whether the button is in a checked/selected/pressed state. */
78
- checked?: boolean | 'indeterminate' | undefined
79
+ interface ToggleButtonProps extends Omit<ButtonProps, 'checked' | 'defaultChecked'> {
80
+ /** Whether the button is in a pressed/selected state. */
81
+ checked?: boolean | undefined
82
+ defaultChecked?: boolean | undefined
79
83
  }
80
- interface LinkProps extends BaseProps, DisableableProps, ComponentProps<'a'> {
84
+ interface LinkProps
85
+ extends BaseProps, DisableableProps, Omit<ComponentProps<'a'>, 'defaultValue'> {
81
86
  href: string
82
87
  type?: undefined
83
88
  checked?: undefined
89
+ defaultChecked?: undefined
84
90
  }
85
91
  }
86
92
 
@@ -114,16 +120,19 @@ interface WithButtonOrLinkContextProps {
114
120
  buttonOrLinkState: ButtonOrLinkState
115
121
  }
116
122
 
117
- const memoizedWithContextComponents = new Map<ElementType, ElementType>()
123
+ type WithContextComponent<T extends ElementType> = (
124
+ props: Merge<ComponentProps<T>, WithButtonOrLinkContextProps>,
125
+ ) => ReactElement
118
126
 
119
- function withContext<T extends ElementType>(Element: T) {
120
- if (memoizedWithContextComponents.has(Element)) {
121
- return memoizedWithContextComponents.get(Element)!
122
- }
123
- 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> = ({
124
133
  buttonOrLinkState,
125
134
  ...props
126
- }: WithButtonOrLinkContextProps & ComponentProps<T>) => (
135
+ }) => (
127
136
  <ButtonOrLinkContext.Provider value={buttonOrLinkState}>
128
137
  <Element {...(props as ComponentProps<T>)} />
129
138
  </ButtonOrLinkContext.Provider>
@@ -135,7 +144,7 @@ function withContext<T extends ElementType>(Element: T) {
135
144
  const ButtonWithContext = withContext('button')
136
145
  const SpanButtonWithContext = withContext(SpanButton)
137
146
  const AnchorWithContext = withContext('a')
138
- const RenderWithContext = withContext(Render as ElementType<RenderProps>)
147
+ const RenderWithContext = withContext(Render)
139
148
 
140
149
  interface ButtonOrLinkConfigContextValue {
141
150
  onClick:
@@ -180,11 +189,22 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
180
189
  inline = false,
181
190
  linkComponent: passedLinkComponent,
182
191
  render,
183
- onClick,
184
192
  className: passedClassName,
185
193
  children,
186
194
  ...nonBaseProps
187
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
+
188
208
  const className = cn('gds-button-or-link', passedClassName)
189
209
 
190
210
  if (props.href === undefined) {
@@ -192,11 +212,19 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
192
212
  role = 'button',
193
213
  type = 'button',
194
214
  checked,
215
+ defaultChecked,
195
216
  href: _href,
196
217
  target: _target,
197
218
  ...remainingProps
198
219
  } = nonBaseProps
199
220
 
221
+ if (defaultChecked !== undefined) {
222
+ // oxlint-disable-next-line no-console
223
+ console.warn(
224
+ '[ButtonOrLink] `defaultChecked` is not supported; use a controlled `checked` prop instead, or wrap `ButtonOrLink` in a component that manages the uncontrolled state',
225
+ )
226
+ }
227
+
200
228
  const Element = inline ? SpanButtonWithContext : ButtonWithContext
201
229
 
202
230
  const state: ButtonOrLinkState = {
@@ -208,24 +236,25 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
208
236
  checked,
209
237
  }
210
238
 
211
- const checkedAttribute = (() => {
212
- if (checked === undefined) {
213
- return {}
214
- }
215
- if (
216
- (role === 'option' || role === 'tab' || role === 'row' || role === 'gridcell') &&
217
- checked !== 'indeterminate'
218
- ) {
219
- return { 'aria-selected': checked }
220
- }
221
- const checkedOrMixed = checked === 'indeterminate' ? ('mixed' as const) : checked
222
- if (role === 'button') {
223
- return { 'aria-pressed': checkedOrMixed }
224
- }
225
- return { 'aria-checked': checkedOrMixed }
226
- })()
227
-
228
- let buttonProps: ComponentProps<typeof Element> = {
239
+ const checkedAttribute =
240
+ checked === undefined
241
+ ? {}
242
+ : ((checked: unknown) => {
243
+ if (
244
+ (role === 'option' || role === 'tab' || role === 'row' || role === 'gridcell') &&
245
+ checked !== 'indeterminate'
246
+ ) {
247
+ return { 'aria-selected': Boolean(checked) }
248
+ }
249
+ const checkedOrMixed =
250
+ checked === 'indeterminate' ? ('mixed' as const) : Boolean(checked)
251
+ if (role === 'button') {
252
+ return { 'aria-pressed': checkedOrMixed }
253
+ }
254
+ return { 'aria-checked': checkedOrMixed }
255
+ })(checked)
256
+
257
+ const buttonProps: ComponentProps<typeof Element> = {
229
258
  role,
230
259
  type: disabled === 'focusable' ? 'button' : type,
231
260
  disabled: disabled === true,
@@ -234,11 +263,8 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
234
263
  className,
235
264
  children,
236
265
  buttonOrLinkState: state,
237
- }
238
- buttonProps = {
239
- ...buttonProps,
240
- onClick: !disabled ? (onClick as typeof buttonProps.onClick) : undefined,
241
- ...(remainingProps as typeof buttonProps),
266
+ ...(remainingProps as ComponentProps<'button'>),
267
+ ...((disabled === 'focusable' || (disabled && inline)) && manuallyDisabledEventProps),
242
268
  }
243
269
 
244
270
  return render ? render(buttonProps, state) : <Element {...buttonProps} />
@@ -251,6 +277,7 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
251
277
  rel = target === '_blank' ? 'noopener noreferrer' : undefined,
252
278
  type: _type,
253
279
  checked: _checked,
280
+ defaultChecked: _defaultChecked,
254
281
  ...remainingProps
255
282
  } = nonBaseProps
256
283
 
@@ -263,26 +290,16 @@ export const ButtonOrLinkRoot = (passedProps: InternalButtonOrLinkProps) => {
263
290
  target,
264
291
  }
265
292
 
266
- let linkProps: ComponentProps<'a'> = disabled
267
- ? {
268
- role,
269
- tabIndex: disabled === 'focusable' ? 0 : undefined,
270
- 'aria-disabled': true,
271
- className,
272
- children,
273
- }
274
- : {
275
- role: role !== 'link' ? role : undefined,
276
- href,
277
- target,
278
- rel,
279
- className,
280
- children,
281
- }
282
- linkProps = {
283
- ...linkProps,
284
- onClick: !disabled ? (onClick as typeof linkProps.onClick) : undefined,
285
- ...(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),
286
303
  }
287
304
 
288
305
  let linkComponent: ElementType | ReactElement | null = null
@@ -408,16 +425,17 @@ function SpanButton({
408
425
  isDisabled: disabled,
409
426
  elementType: 'span',
410
427
  onPress: (event) => {
411
- const mouseEvent = new MouseEvent('click', {
412
- altKey: event.altKey,
413
- ctrlKey: event.ctrlKey,
414
- metaKey: event.metaKey,
415
- shiftKey: event.shiftKey,
416
- relatedTarget: event.target,
417
- bubbles: true,
418
- cancelable: true,
419
- })
420
- 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
+ )
421
439
  },
422
440
  onPressStart: (event) => {
423
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'
@@ -14,6 +14,8 @@ export { ButtonGroup, type ButtonGroupProps } from './ButtonGroup.tsx'
14
14
  export { ButtonGroupMeta } from './ButtonGroup.meta.ts'
15
15
  export { Card, type CardProps } from './Card.tsx'
16
16
  export { CardMeta } from './Card.meta.ts'
17
+ export { Chip, type ChipProps, type ChipGroupProps } from './Chip.tsx'
18
+ export { ChipMeta, ChipGroupMeta } from './Chip.meta.ts'
17
19
  export { Cluster, type ClusterProps } from './Cluster.tsx'
18
20
  export { ClusterMeta } from './Cluster.meta.ts'
19
21
  export { CodeBlock, type CodeBlockProps, type CodeBlockTabsProps } from './CodeBlock.tsx'
@@ -95,8 +97,7 @@ export { ToggleButton, type ToggleButtonProps } from './ToggleButton.tsx'
95
97
  export { ToggleButtonMeta } from './ToggleButton.meta.ts'
96
98
  export {
97
99
  Tooltip,
98
- useCollectTooltip,
99
- useCollectedTooltip,
100
+ useTooltipCollector,
100
101
  type TooltipProps,
101
102
  type TooltipCollectorProps,
102
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
  }