@womp/kookie-ui 0.3.25 → 0.4.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 (582) hide show
  1. package/AUTHORS +27 -0
  2. package/LICENSE +29 -0
  3. package/README.md +21 -1
  4. package/components.css +163 -118
  5. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  6. package/dist/cjs/components/_internal/base-button.js +1 -1
  7. package/dist/cjs/components/_internal/base-button.js.map +4 -4
  8. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js +1 -1
  9. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js.map +3 -3
  10. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  11. package/dist/cjs/components/_internal/shell-bottom.js.map +4 -4
  12. package/dist/cjs/components/_internal/shell-handles.d.ts.map +1 -1
  13. package/dist/cjs/components/_internal/shell-handles.js +1 -1
  14. package/dist/cjs/components/_internal/shell-handles.js.map +3 -3
  15. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  16. package/dist/cjs/components/_internal/shell-inspector.js.map +4 -4
  17. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  18. package/dist/cjs/components/_internal/shell-sidebar.js.map +4 -4
  19. package/dist/cjs/components/accordion.d.ts.map +1 -1
  20. package/dist/cjs/components/accordion.js +1 -1
  21. package/dist/cjs/components/accordion.js.map +4 -4
  22. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  23. package/dist/cjs/components/alert-dialog.js +1 -1
  24. package/dist/cjs/components/alert-dialog.js.map +4 -4
  25. package/dist/cjs/components/avatar.js +1 -1
  26. package/dist/cjs/components/avatar.js.map +4 -4
  27. package/dist/cjs/components/badge.d.ts.map +1 -1
  28. package/dist/cjs/components/badge.js +1 -1
  29. package/dist/cjs/components/badge.js.map +4 -4
  30. package/dist/cjs/components/blockquote.js +1 -1
  31. package/dist/cjs/components/blockquote.js.map +4 -4
  32. package/dist/cjs/components/box.js +1 -1
  33. package/dist/cjs/components/box.js.map +4 -4
  34. package/dist/cjs/components/button.js +1 -1
  35. package/dist/cjs/components/button.js.map +4 -4
  36. package/dist/cjs/components/callout.js +1 -1
  37. package/dist/cjs/components/callout.js.map +4 -4
  38. package/dist/cjs/components/card.js +1 -1
  39. package/dist/cjs/components/card.js.map +4 -4
  40. package/dist/cjs/components/chatbar.js +2 -2
  41. package/dist/cjs/components/chatbar.js.map +4 -4
  42. package/dist/cjs/components/checkbox-cards.js +1 -1
  43. package/dist/cjs/components/checkbox-cards.js.map +4 -4
  44. package/dist/cjs/components/checkbox-group.js +1 -1
  45. package/dist/cjs/components/checkbox-group.js.map +4 -4
  46. package/dist/cjs/components/checkbox.js +1 -1
  47. package/dist/cjs/components/checkbox.js.map +4 -4
  48. package/dist/cjs/components/code.js +1 -1
  49. package/dist/cjs/components/code.js.map +4 -4
  50. package/dist/cjs/components/combobox.js +1 -1
  51. package/dist/cjs/components/combobox.js.map +4 -4
  52. package/dist/cjs/components/container.js +1 -1
  53. package/dist/cjs/components/container.js.map +4 -4
  54. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  55. package/dist/cjs/components/context-menu.js +1 -1
  56. package/dist/cjs/components/context-menu.js.map +4 -4
  57. package/dist/cjs/components/data-list.js +1 -1
  58. package/dist/cjs/components/data-list.js.map +4 -4
  59. package/dist/cjs/components/dialog.d.ts.map +1 -1
  60. package/dist/cjs/components/dialog.js +1 -1
  61. package/dist/cjs/components/dialog.js.map +4 -4
  62. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  63. package/dist/cjs/components/dropdown-menu.js +1 -1
  64. package/dist/cjs/components/dropdown-menu.js.map +4 -4
  65. package/dist/cjs/components/em.js +1 -1
  66. package/dist/cjs/components/em.js.map +4 -4
  67. package/dist/cjs/components/flex.js +1 -1
  68. package/dist/cjs/components/flex.js.map +4 -4
  69. package/dist/cjs/components/grid.js +1 -1
  70. package/dist/cjs/components/grid.js.map +4 -4
  71. package/dist/cjs/components/heading.js +1 -1
  72. package/dist/cjs/components/heading.js.map +4 -4
  73. package/dist/cjs/components/hover-card.js +1 -1
  74. package/dist/cjs/components/hover-card.js.map +4 -4
  75. package/dist/cjs/components/icon-button.js +2 -2
  76. package/dist/cjs/components/icon-button.js.map +4 -4
  77. package/dist/cjs/components/image.js +1 -1
  78. package/dist/cjs/components/image.js.map +4 -4
  79. package/dist/cjs/components/index.js +5 -5
  80. package/dist/cjs/components/index.js.map +4 -4
  81. package/dist/cjs/components/inset.js +1 -1
  82. package/dist/cjs/components/inset.js.map +4 -4
  83. package/dist/cjs/components/kbd.js +1 -1
  84. package/dist/cjs/components/kbd.js.map +4 -4
  85. package/dist/cjs/components/link.js +1 -1
  86. package/dist/cjs/components/link.js.map +4 -4
  87. package/dist/cjs/components/navbar.js +1 -1
  88. package/dist/cjs/components/navbar.js.map +4 -4
  89. package/dist/cjs/components/popover.js +1 -1
  90. package/dist/cjs/components/popover.js.map +4 -4
  91. package/dist/cjs/components/progress.js +1 -1
  92. package/dist/cjs/components/progress.js.map +4 -4
  93. package/dist/cjs/components/quote.js +1 -1
  94. package/dist/cjs/components/quote.js.map +4 -4
  95. package/dist/cjs/components/radio-cards.js +1 -1
  96. package/dist/cjs/components/radio-cards.js.map +4 -4
  97. package/dist/cjs/components/radio-group.js +1 -1
  98. package/dist/cjs/components/radio-group.js.map +4 -4
  99. package/dist/cjs/components/radio.js +1 -1
  100. package/dist/cjs/components/radio.js.map +4 -4
  101. package/dist/cjs/components/schemas/base-button.schema.d.ts +2 -2
  102. package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
  103. package/dist/cjs/components/schemas/icon-button.schema.d.ts +4 -4
  104. package/dist/cjs/components/schemas/shell.schema.d.ts +2 -2
  105. package/dist/cjs/components/schemas/toggle-button.schema.d.ts +6 -6
  106. package/dist/cjs/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  107. package/dist/cjs/components/scroll-area.js +1 -1
  108. package/dist/cjs/components/scroll-area.js.map +4 -4
  109. package/dist/cjs/components/section.js +1 -1
  110. package/dist/cjs/components/section.js.map +4 -4
  111. package/dist/cjs/components/segmented-control.js +1 -1
  112. package/dist/cjs/components/segmented-control.js.map +4 -4
  113. package/dist/cjs/components/select.js +1 -1
  114. package/dist/cjs/components/select.js.map +4 -4
  115. package/dist/cjs/components/separator.js +1 -1
  116. package/dist/cjs/components/separator.js.map +4 -4
  117. package/dist/cjs/components/sheet.d.ts.map +1 -1
  118. package/dist/cjs/components/sheet.js +1 -1
  119. package/dist/cjs/components/sheet.js.map +4 -4
  120. package/dist/cjs/components/shell.js +1 -1
  121. package/dist/cjs/components/shell.js.map +4 -4
  122. package/dist/cjs/components/sidebar.js +1 -1
  123. package/dist/cjs/components/sidebar.js.map +4 -4
  124. package/dist/cjs/components/skeleton.js +1 -1
  125. package/dist/cjs/components/skeleton.js.map +4 -4
  126. package/dist/cjs/components/slider.js +1 -1
  127. package/dist/cjs/components/slider.js.map +4 -4
  128. package/dist/cjs/components/spinner.js +1 -1
  129. package/dist/cjs/components/spinner.js.map +4 -4
  130. package/dist/cjs/components/strong.js +1 -1
  131. package/dist/cjs/components/strong.js.map +4 -4
  132. package/dist/cjs/components/switch.js +1 -1
  133. package/dist/cjs/components/switch.js.map +4 -4
  134. package/dist/cjs/components/tab-nav.js +1 -1
  135. package/dist/cjs/components/tab-nav.js.map +4 -4
  136. package/dist/cjs/components/table.js +1 -1
  137. package/dist/cjs/components/table.js.map +4 -4
  138. package/dist/cjs/components/tabs.js +1 -1
  139. package/dist/cjs/components/tabs.js.map +4 -4
  140. package/dist/cjs/components/text-area.js +1 -1
  141. package/dist/cjs/components/text-area.js.map +4 -4
  142. package/dist/cjs/components/text-field.js +2 -2
  143. package/dist/cjs/components/text-field.js.map +4 -4
  144. package/dist/cjs/components/text.js +1 -1
  145. package/dist/cjs/components/text.js.map +4 -4
  146. package/dist/cjs/components/theme-panel.js +3 -3
  147. package/dist/cjs/components/theme-panel.js.map +4 -4
  148. package/dist/cjs/components/theme.d.ts +3 -0
  149. package/dist/cjs/components/theme.d.ts.map +1 -1
  150. package/dist/cjs/components/theme.js +1 -1
  151. package/dist/cjs/components/theme.js.map +4 -4
  152. package/dist/cjs/components/theme.props.d.ts +15 -1
  153. package/dist/cjs/components/theme.props.d.ts.map +1 -1
  154. package/dist/cjs/components/theme.props.js +1 -1
  155. package/dist/cjs/components/theme.props.js.map +2 -2
  156. package/dist/cjs/components/toggle-button.js +2 -2
  157. package/dist/cjs/components/toggle-button.js.map +4 -4
  158. package/dist/cjs/components/toggle-icon-button.js +3 -3
  159. package/dist/cjs/components/toggle-icon-button.js.map +4 -4
  160. package/dist/cjs/components/toolbar.js +1 -1
  161. package/dist/cjs/components/toolbar.js.map +4 -4
  162. package/dist/cjs/components/tooltip.js +1 -1
  163. package/dist/cjs/components/tooltip.js.map +4 -4
  164. package/dist/cjs/components/user-card.js +1 -1
  165. package/dist/cjs/components/user-card.js.map +4 -4
  166. package/dist/cjs/helpers/compile-prop-defs.d.ts +49 -0
  167. package/dist/cjs/helpers/compile-prop-defs.d.ts.map +1 -0
  168. package/dist/cjs/helpers/compile-prop-defs.js +2 -0
  169. package/dist/cjs/helpers/compile-prop-defs.js.map +7 -0
  170. package/dist/cjs/helpers/extract-props.d.ts.map +1 -1
  171. package/dist/cjs/helpers/extract-props.js +1 -1
  172. package/dist/cjs/helpers/extract-props.js.map +4 -4
  173. package/dist/cjs/helpers/font-config.d.ts +84 -77
  174. package/dist/cjs/helpers/font-config.d.ts.map +1 -1
  175. package/dist/cjs/helpers/font-config.js +5 -2
  176. package/dist/cjs/helpers/font-config.js.map +3 -3
  177. package/dist/cjs/helpers/get-margin-styles.d.ts.map +1 -1
  178. package/dist/cjs/helpers/get-margin-styles.js +1 -1
  179. package/dist/cjs/helpers/get-margin-styles.js.map +3 -3
  180. package/dist/cjs/helpers/get-responsive-styles.d.ts +5 -2
  181. package/dist/cjs/helpers/get-responsive-styles.d.ts.map +1 -1
  182. package/dist/cjs/helpers/get-responsive-styles.js +1 -1
  183. package/dist/cjs/helpers/get-responsive-styles.js.map +3 -3
  184. package/dist/cjs/helpers/index.js +5 -2
  185. package/dist/cjs/helpers/index.js.map +4 -4
  186. package/dist/cjs/helpers/use-deprecation-warning.d.ts +10 -0
  187. package/dist/cjs/helpers/use-deprecation-warning.d.ts.map +1 -0
  188. package/dist/cjs/helpers/use-deprecation-warning.js +2 -0
  189. package/dist/cjs/helpers/use-deprecation-warning.js.map +7 -0
  190. package/dist/cjs/hooks/index.js +2 -2
  191. package/dist/cjs/hooks/index.js.map +3 -3
  192. package/dist/cjs/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  193. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js +1 -1
  194. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js.map +3 -3
  195. package/dist/cjs/hooks/use-breakpoint.d.ts +7 -3
  196. package/dist/cjs/hooks/use-breakpoint.d.ts.map +1 -1
  197. package/dist/cjs/hooks/use-breakpoint.js +1 -1
  198. package/dist/cjs/hooks/use-breakpoint.js.map +3 -3
  199. package/dist/cjs/hooks/use-prop-synced-state.d.ts +14 -0
  200. package/dist/cjs/hooks/use-prop-synced-state.d.ts.map +1 -0
  201. package/dist/cjs/hooks/use-prop-synced-state.js +2 -0
  202. package/dist/cjs/hooks/use-prop-synced-state.js.map +7 -0
  203. package/dist/cjs/index.js +5 -5
  204. package/dist/cjs/index.js.map +4 -4
  205. package/dist/cjs/props/index.js +1 -1
  206. package/dist/cjs/props/index.js.map +2 -2
  207. package/dist/esm/{chunk-WYA4IRU6.js → chunk-25WZA7ZU.js} +2 -2
  208. package/dist/esm/{chunk-ARGX2ZZK.js → chunk-2FYJTSOP.js} +2 -2
  209. package/dist/esm/chunk-2UPAYDKR.js +2 -0
  210. package/dist/esm/chunk-2UPAYDKR.js.map +7 -0
  211. package/dist/esm/chunk-374ZYJUP.js +2 -0
  212. package/dist/esm/chunk-374ZYJUP.js.map +7 -0
  213. package/dist/esm/{chunk-K3R4AH3E.js → chunk-3MWWP4MW.js} +2 -2
  214. package/dist/esm/{chunk-HQ35PM4O.js → chunk-43A5GUSI.js} +2 -2
  215. package/dist/esm/{chunk-Z5DQ6FSA.js → chunk-4AQTUBVP.js} +2 -2
  216. package/dist/esm/{chunk-QLIELX4I.js → chunk-4ME6O27S.js} +2 -2
  217. package/dist/esm/chunk-4XJY6FIK.js +2 -0
  218. package/dist/esm/chunk-4XJY6FIK.js.map +7 -0
  219. package/dist/esm/{chunk-JQOFJNCV.js → chunk-4YFJWXL2.js} +2 -2
  220. package/dist/esm/chunk-5TXQLK4G.js +2 -0
  221. package/dist/esm/chunk-5TXQLK4G.js.map +7 -0
  222. package/dist/esm/{chunk-IPJUHVM6.js → chunk-666GX7O5.js} +2 -2
  223. package/dist/esm/chunk-6FLLFCBU.js +2 -0
  224. package/dist/esm/chunk-6FLLFCBU.js.map +7 -0
  225. package/dist/esm/{chunk-7CBAHIVG.js → chunk-6IGTK4JE.js} +2 -2
  226. package/dist/esm/chunk-6XGZPIUT.js +2 -0
  227. package/dist/esm/{chunk-T27QHMW7.js.map → chunk-6XGZPIUT.js.map} +2 -2
  228. package/dist/esm/{chunk-DJBPM5QK.js → chunk-7FC7HF76.js} +2 -2
  229. package/dist/esm/{chunk-SVLY6B5F.js → chunk-7QDTSBJF.js} +2 -2
  230. package/dist/esm/{chunk-7MURQ6CR.js → chunk-A2RZGGMY.js} +2 -2
  231. package/dist/esm/{chunk-VF5TRT3H.js → chunk-AU3D6F42.js} +2 -2
  232. package/dist/esm/chunk-AX5S56DS.js +2 -0
  233. package/dist/esm/chunk-AX5S56DS.js.map +7 -0
  234. package/dist/esm/{chunk-DK5MHD6I.js → chunk-B24BDVG2.js} +2 -2
  235. package/dist/esm/{chunk-BJTJUIYJ.js → chunk-CRWYCLTE.js} +2 -2
  236. package/dist/esm/{chunk-OHJVFZMH.js → chunk-CSKZZOI2.js} +2 -2
  237. package/dist/esm/{chunk-4N5JU7XQ.js → chunk-CVWCKOHO.js} +2 -2
  238. package/dist/esm/chunk-CWRNW44F.js +2 -0
  239. package/dist/esm/chunk-CWRNW44F.js.map +7 -0
  240. package/dist/esm/{chunk-ADYTQCZX.js → chunk-D6B7IMZU.js} +2 -2
  241. package/dist/esm/{chunk-U7AASKZI.js → chunk-DNHUQLXO.js} +2 -2
  242. package/dist/esm/{chunk-USGTBZ43.js → chunk-E67CIG6A.js} +2 -2
  243. package/dist/esm/{chunk-YUZPSUJE.js → chunk-F7IYL2VW.js} +2 -2
  244. package/dist/esm/{chunk-FVCWNSRU.js → chunk-FHOCUZDR.js} +2 -2
  245. package/dist/esm/{chunk-APRBRAOT.js → chunk-FXUUI6Z2.js} +2 -2
  246. package/dist/esm/{chunk-WNSPLWRV.js → chunk-GJSGKE7B.js} +2 -2
  247. package/dist/esm/{chunk-OGOOZLUD.js → chunk-GLERJXVS.js} +2 -2
  248. package/dist/esm/{chunk-6VGPTAHM.js → chunk-GWXVETMF.js} +2 -2
  249. package/dist/esm/{chunk-ES7MK2MM.js → chunk-GYBLXQ4R.js} +2 -2
  250. package/dist/esm/{chunk-4OBMRJHC.js → chunk-H7ST535H.js} +2 -2
  251. package/dist/esm/{chunk-QLZ5XAW6.js → chunk-HF5WY5YE.js} +2 -2
  252. package/dist/esm/{chunk-RDP4UQ42.js → chunk-IEWCQU2S.js} +2 -2
  253. package/dist/esm/{chunk-XLOHPURR.js → chunk-IHK3H2OM.js} +2 -2
  254. package/dist/esm/{chunk-EJWAAFCI.js → chunk-IKSN4RNB.js} +2 -2
  255. package/dist/esm/{chunk-3F6I7YOR.js → chunk-JDGJSNWT.js} +2 -2
  256. package/dist/esm/chunk-JUY7CBSL.js +2 -0
  257. package/dist/esm/chunk-JUY7CBSL.js.map +7 -0
  258. package/dist/esm/{chunk-ZSEFZM5H.js → chunk-K6QZMNCD.js} +2 -2
  259. package/dist/esm/chunk-KKBP2CRH.js +2 -0
  260. package/dist/esm/chunk-KKBP2CRH.js.map +7 -0
  261. package/dist/esm/{chunk-ZHYOJNWV.js → chunk-LKAK5GXF.js} +2 -2
  262. package/dist/esm/{chunk-GWYFT3EI.js → chunk-M24UXMOQ.js} +2 -2
  263. package/dist/esm/{chunk-JCYI4NTV.js → chunk-MBCBP73P.js} +2 -2
  264. package/dist/esm/{chunk-UYNYUR7O.js → chunk-MBE2YSBU.js} +2 -2
  265. package/dist/esm/chunk-MHANZINI.js +2 -0
  266. package/dist/esm/chunk-MHANZINI.js.map +7 -0
  267. package/dist/esm/chunk-MK2R6DAU.js +2 -0
  268. package/dist/esm/chunk-MK2R6DAU.js.map +7 -0
  269. package/dist/esm/{chunk-DNI4QRXQ.js → chunk-MOR3NSXQ.js} +2 -2
  270. package/dist/esm/{chunk-H2G446JG.js → chunk-NMKPFUNP.js} +2 -2
  271. package/dist/esm/{chunk-TEULZKBM.js → chunk-OGXZHAQL.js} +2 -2
  272. package/dist/esm/{chunk-M3ZYJANH.js → chunk-OSRJRBKP.js} +2 -2
  273. package/dist/esm/{chunk-2AEELIG6.js → chunk-OWAUCLRT.js} +2 -2
  274. package/dist/esm/{chunk-7CXVHFMQ.js → chunk-P7HYVJSU.js} +2 -2
  275. package/dist/esm/{chunk-4532RT2B.js → chunk-P7IAHW4V.js} +2 -2
  276. package/dist/esm/{chunk-GLC4QJBF.js → chunk-PLWXTEVE.js} +2 -2
  277. package/dist/esm/{chunk-SGU4HUHF.js → chunk-PTLFMWCN.js} +2 -2
  278. package/dist/esm/{chunk-QOWA5LK5.js → chunk-QEOAXJLN.js} +2 -2
  279. package/dist/esm/{chunk-XHQGMOXV.js → chunk-RMKXWYOV.js} +2 -2
  280. package/dist/esm/chunk-S2HA3W3V.js +2 -0
  281. package/dist/esm/chunk-S2HA3W3V.js.map +7 -0
  282. package/dist/esm/{chunk-WZCZHCVE.js → chunk-S56YSRHP.js} +2 -2
  283. package/dist/esm/{chunk-E6IWYD3U.js → chunk-S5C5YRBS.js} +2 -2
  284. package/dist/esm/{chunk-A24PYRVV.js → chunk-SO67YEVQ.js} +2 -2
  285. package/dist/esm/chunk-TLWTUKKL.js +2 -0
  286. package/dist/esm/chunk-TLWTUKKL.js.map +7 -0
  287. package/dist/esm/{chunk-RQ2ZPMHJ.js → chunk-TOLLPRMM.js} +2 -2
  288. package/dist/esm/{chunk-HACQF6F4.js → chunk-TOOSHJOA.js} +2 -2
  289. package/dist/esm/{chunk-42HFGCHX.js → chunk-UGD7Z3L4.js} +2 -2
  290. package/dist/esm/chunk-VA5A4MHU.js +6 -0
  291. package/dist/esm/chunk-VA5A4MHU.js.map +7 -0
  292. package/dist/esm/{chunk-DXI5P5O4.js → chunk-VX6ARMWP.js} +2 -2
  293. package/dist/esm/{chunk-25U7DENY.js → chunk-W7N7V5YD.js} +2 -2
  294. package/dist/esm/chunk-WAURCNAS.js +2 -0
  295. package/dist/esm/chunk-WAURCNAS.js.map +7 -0
  296. package/dist/esm/chunk-WFMYNZXZ.js +2 -0
  297. package/dist/esm/chunk-WFMYNZXZ.js.map +7 -0
  298. package/dist/esm/{chunk-6FAICIYS.js → chunk-XMRIRFM7.js} +2 -2
  299. package/dist/esm/chunk-YEB3H7QN.js +2 -0
  300. package/dist/esm/chunk-YEB3H7QN.js.map +7 -0
  301. package/dist/esm/chunk-YUP6EICB.js +2 -0
  302. package/dist/esm/chunk-YUP6EICB.js.map +7 -0
  303. package/dist/esm/chunk-YV2KYHGR.js +2 -0
  304. package/dist/esm/chunk-YV2KYHGR.js.map +7 -0
  305. package/dist/esm/{chunk-UIEUZLZZ.js → chunk-ZY6SQWHT.js} +2 -2
  306. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  307. package/dist/esm/components/_internal/base-button.js +1 -1
  308. package/dist/esm/components/_internal/dropdown-menu-drill-down.js +1 -1
  309. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  310. package/dist/esm/components/_internal/shell-handles.d.ts.map +1 -1
  311. package/dist/esm/components/_internal/shell-handles.js +1 -1
  312. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  313. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  314. package/dist/esm/components/accordion.d.ts.map +1 -1
  315. package/dist/esm/components/accordion.js +1 -1
  316. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  317. package/dist/esm/components/alert-dialog.js +1 -1
  318. package/dist/esm/components/avatar.js +1 -1
  319. package/dist/esm/components/badge.d.ts.map +1 -1
  320. package/dist/esm/components/badge.js +1 -1
  321. package/dist/esm/components/blockquote.js +1 -1
  322. package/dist/esm/components/box.js +1 -1
  323. package/dist/esm/components/button.js +1 -1
  324. package/dist/esm/components/callout.js +1 -1
  325. package/dist/esm/components/card.js +1 -1
  326. package/dist/esm/components/chatbar.js +1 -1
  327. package/dist/esm/components/checkbox-cards.js +1 -1
  328. package/dist/esm/components/checkbox-group.js +1 -1
  329. package/dist/esm/components/checkbox.js +1 -1
  330. package/dist/esm/components/code.js +1 -1
  331. package/dist/esm/components/combobox.js +1 -1
  332. package/dist/esm/components/container.js +1 -1
  333. package/dist/esm/components/context-menu.d.ts.map +1 -1
  334. package/dist/esm/components/context-menu.js +1 -1
  335. package/dist/esm/components/data-list.js +1 -1
  336. package/dist/esm/components/dialog.d.ts.map +1 -1
  337. package/dist/esm/components/dialog.js +1 -1
  338. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  339. package/dist/esm/components/dropdown-menu.js +1 -1
  340. package/dist/esm/components/em.js +1 -1
  341. package/dist/esm/components/flex.js +1 -1
  342. package/dist/esm/components/grid.js +1 -1
  343. package/dist/esm/components/heading.js +1 -1
  344. package/dist/esm/components/hover-card.js +1 -1
  345. package/dist/esm/components/icon-button.js +1 -1
  346. package/dist/esm/components/image.js +1 -1
  347. package/dist/esm/components/index.js +1 -1
  348. package/dist/esm/components/inset.js +1 -1
  349. package/dist/esm/components/kbd.js +1 -1
  350. package/dist/esm/components/link.js +1 -1
  351. package/dist/esm/components/navbar.js +1 -1
  352. package/dist/esm/components/popover.js +1 -1
  353. package/dist/esm/components/progress.js +1 -1
  354. package/dist/esm/components/quote.js +1 -1
  355. package/dist/esm/components/radio-cards.js +1 -1
  356. package/dist/esm/components/radio-group.js +1 -1
  357. package/dist/esm/components/radio.js +1 -1
  358. package/dist/esm/components/schemas/base-button.schema.d.ts +2 -2
  359. package/dist/esm/components/schemas/button.schema.d.ts +2 -2
  360. package/dist/esm/components/schemas/icon-button.schema.d.ts +4 -4
  361. package/dist/esm/components/schemas/shell.schema.d.ts +2 -2
  362. package/dist/esm/components/schemas/toggle-button.schema.d.ts +6 -6
  363. package/dist/esm/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  364. package/dist/esm/components/scroll-area.js +1 -1
  365. package/dist/esm/components/section.js +1 -1
  366. package/dist/esm/components/segmented-control.js +1 -1
  367. package/dist/esm/components/select.js +1 -1
  368. package/dist/esm/components/separator.js +1 -1
  369. package/dist/esm/components/sheet.d.ts.map +1 -1
  370. package/dist/esm/components/sheet.js +1 -1
  371. package/dist/esm/components/shell.js +1 -1
  372. package/dist/esm/components/sidebar.js +1 -1
  373. package/dist/esm/components/skeleton.js +1 -1
  374. package/dist/esm/components/slider.js +1 -1
  375. package/dist/esm/components/spinner.js +1 -1
  376. package/dist/esm/components/strong.js +1 -1
  377. package/dist/esm/components/switch.js +1 -1
  378. package/dist/esm/components/tab-nav.js +1 -1
  379. package/dist/esm/components/table.js +1 -1
  380. package/dist/esm/components/tabs.js +1 -1
  381. package/dist/esm/components/text-area.js +1 -1
  382. package/dist/esm/components/text-field.js +1 -1
  383. package/dist/esm/components/text.js +1 -1
  384. package/dist/esm/components/theme-panel.js +1 -1
  385. package/dist/esm/components/theme.d.ts +3 -0
  386. package/dist/esm/components/theme.d.ts.map +1 -1
  387. package/dist/esm/components/theme.js +1 -1
  388. package/dist/esm/components/theme.props.d.ts +15 -1
  389. package/dist/esm/components/theme.props.d.ts.map +1 -1
  390. package/dist/esm/components/theme.props.js +1 -1
  391. package/dist/esm/components/toggle-button.js +1 -1
  392. package/dist/esm/components/toggle-icon-button.js +1 -1
  393. package/dist/esm/components/toolbar.js +1 -1
  394. package/dist/esm/components/tooltip.js +1 -1
  395. package/dist/esm/components/user-card.js +1 -1
  396. package/dist/esm/helpers/compile-prop-defs.d.ts +49 -0
  397. package/dist/esm/helpers/compile-prop-defs.d.ts.map +1 -0
  398. package/dist/esm/helpers/compile-prop-defs.js +2 -0
  399. package/dist/esm/helpers/compile-prop-defs.js.map +7 -0
  400. package/dist/esm/helpers/extract-props.d.ts.map +1 -1
  401. package/dist/esm/helpers/extract-props.js +1 -1
  402. package/dist/esm/helpers/font-config.d.ts +84 -77
  403. package/dist/esm/helpers/font-config.d.ts.map +1 -1
  404. package/dist/esm/helpers/font-config.js +1 -1
  405. package/dist/esm/helpers/get-margin-styles.d.ts.map +1 -1
  406. package/dist/esm/helpers/get-margin-styles.js +1 -1
  407. package/dist/esm/helpers/get-responsive-styles.d.ts +5 -2
  408. package/dist/esm/helpers/get-responsive-styles.d.ts.map +1 -1
  409. package/dist/esm/helpers/get-responsive-styles.js +1 -1
  410. package/dist/esm/helpers/index.js +1 -1
  411. package/dist/esm/helpers/use-deprecation-warning.d.ts +10 -0
  412. package/dist/esm/helpers/use-deprecation-warning.d.ts.map +1 -0
  413. package/dist/esm/helpers/use-deprecation-warning.js +2 -0
  414. package/dist/esm/helpers/use-deprecation-warning.js.map +7 -0
  415. package/dist/esm/hooks/index.js +1 -1
  416. package/dist/esm/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  417. package/dist/esm/hooks/use-body-pointer-events-cleanup.js +1 -1
  418. package/dist/esm/hooks/use-breakpoint.d.ts +7 -3
  419. package/dist/esm/hooks/use-breakpoint.d.ts.map +1 -1
  420. package/dist/esm/hooks/use-breakpoint.js +1 -1
  421. package/dist/esm/hooks/use-prop-synced-state.d.ts +14 -0
  422. package/dist/esm/hooks/use-prop-synced-state.d.ts.map +1 -0
  423. package/dist/esm/hooks/use-prop-synced-state.js +2 -0
  424. package/dist/esm/hooks/use-prop-synced-state.js.map +7 -0
  425. package/dist/esm/index.js +1 -1
  426. package/dist/esm/props/index.js +1 -1
  427. package/fonts.css +8 -0
  428. package/package.json +18 -7
  429. package/schemas/base-button.json +0 -1
  430. package/schemas/button.json +0 -1
  431. package/schemas/icon-button.json +0 -1
  432. package/schemas/index.json +0 -6
  433. package/schemas/toggle-button.json +0 -1
  434. package/schemas/toggle-icon-button.json +0 -1
  435. package/src/components/_internal/base-button.css +2 -2
  436. package/src/components/_internal/base-button.tsx +3 -58
  437. package/src/components/_internal/base-card.css +19 -4
  438. package/src/components/_internal/base-checkbox.css +2 -2
  439. package/src/components/_internal/base-dialog.css +7 -0
  440. package/src/components/_internal/base-menu.css +7 -0
  441. package/src/components/_internal/base-radio.css +2 -2
  442. package/src/components/_internal/base-sidebar.css +7 -0
  443. package/src/components/_internal/base-tab-list.css +2 -2
  444. package/src/components/_internal/shell-handles.tsx +27 -0
  445. package/src/components/accordion.css +6 -6
  446. package/src/components/accordion.tsx +2 -8
  447. package/src/components/alert-dialog.tsx +22 -20
  448. package/src/components/avatar.css +2 -2
  449. package/src/components/badge.css +2 -2
  450. package/src/components/badge.tsx +2 -8
  451. package/src/components/callout.css +2 -2
  452. package/src/components/chatbar.css +1 -1
  453. package/src/components/context-menu.tsx +2 -8
  454. package/src/components/dialog.tsx +22 -20
  455. package/src/components/dropdown-menu.tsx +2 -8
  456. package/src/components/heading.css +10 -3
  457. package/src/components/popover.css +7 -0
  458. package/src/components/progress.css +21 -8
  459. package/src/components/segmented-control.css +2 -2
  460. package/src/components/select.css +9 -2
  461. package/src/components/sheet.tsx +31 -28
  462. package/src/components/shell.css +106 -69
  463. package/src/components/slider.css +2 -2
  464. package/src/components/switch.css +2 -2
  465. package/src/components/table.css +7 -0
  466. package/src/components/text-area.css +2 -2
  467. package/src/components/text-field.css +2 -2
  468. package/src/components/text.css +10 -3
  469. package/src/components/theme.props.tsx +13 -1
  470. package/src/components/theme.tsx +53 -34
  471. package/src/helpers/compile-prop-defs.ts +121 -0
  472. package/src/helpers/extract-props.ts +104 -83
  473. package/src/helpers/font-config.ts +130 -148
  474. package/src/helpers/get-margin-styles.ts +38 -71
  475. package/src/helpers/get-responsive-styles.ts +37 -38
  476. package/src/helpers/use-deprecation-warning.ts +26 -0
  477. package/src/hooks/use-body-pointer-events-cleanup.ts +36 -6
  478. package/src/hooks/use-breakpoint.ts +94 -53
  479. package/src/hooks/use-prop-synced-state.ts +24 -0
  480. package/src/styles/fonts.css +24 -29
  481. package/src/styles/index.css +0 -1
  482. package/src/styles/tokens/base.css +1 -0
  483. package/src/styles/tokens/blur.css +28 -0
  484. package/src/styles/tokens/color.css +3 -3
  485. package/src/styles/tokens/constants.css +11 -0
  486. package/src/styles/tokens/font-family.css +263 -0
  487. package/src/styles/tokens/typography.css +2 -216
  488. package/styles.css +8776 -8727
  489. package/tokens/base.css +50 -30
  490. package/tokens.css +53 -30
  491. package/dist/esm/chunk-2SS3FA3N.js +0 -2
  492. package/dist/esm/chunk-2SS3FA3N.js.map +0 -7
  493. package/dist/esm/chunk-5U2Q23K3.js +0 -2
  494. package/dist/esm/chunk-5U2Q23K3.js.map +0 -7
  495. package/dist/esm/chunk-6ELPYR73.js +0 -2
  496. package/dist/esm/chunk-6ELPYR73.js.map +0 -7
  497. package/dist/esm/chunk-DZ4H2KTP.js +0 -2
  498. package/dist/esm/chunk-DZ4H2KTP.js.map +0 -7
  499. package/dist/esm/chunk-H4MMVAGQ.js +0 -2
  500. package/dist/esm/chunk-H4MMVAGQ.js.map +0 -7
  501. package/dist/esm/chunk-ITRVKLYU.js +0 -2
  502. package/dist/esm/chunk-ITRVKLYU.js.map +0 -7
  503. package/dist/esm/chunk-KCAFSCOV.js +0 -2
  504. package/dist/esm/chunk-KCAFSCOV.js.map +0 -7
  505. package/dist/esm/chunk-KMPBTEZH.js +0 -2
  506. package/dist/esm/chunk-KMPBTEZH.js.map +0 -7
  507. package/dist/esm/chunk-LN5SP46K.js +0 -2
  508. package/dist/esm/chunk-LN5SP46K.js.map +0 -7
  509. package/dist/esm/chunk-OKJNS7Z7.js +0 -2
  510. package/dist/esm/chunk-OKJNS7Z7.js.map +0 -7
  511. package/dist/esm/chunk-Q73Y5O5P.js +0 -2
  512. package/dist/esm/chunk-Q73Y5O5P.js.map +0 -7
  513. package/dist/esm/chunk-Q7P6BTVU.js +0 -3
  514. package/dist/esm/chunk-Q7P6BTVU.js.map +0 -7
  515. package/dist/esm/chunk-T27QHMW7.js +0 -2
  516. package/dist/esm/chunk-UUX42HBM.js +0 -2
  517. package/dist/esm/chunk-UUX42HBM.js.map +0 -7
  518. package/dist/esm/chunk-X7BD5FLE.js +0 -2
  519. package/dist/esm/chunk-X7BD5FLE.js.map +0 -7
  520. package/dist/esm/chunk-YEA646GM.js +0 -2
  521. package/dist/esm/chunk-YEA646GM.js.map +0 -7
  522. package/dist/esm/chunk-ZMEXIPWM.js +0 -2
  523. package/dist/esm/chunk-ZMEXIPWM.js.map +0 -7
  524. /package/dist/esm/{chunk-WYA4IRU6.js.map → chunk-25WZA7ZU.js.map} +0 -0
  525. /package/dist/esm/{chunk-ARGX2ZZK.js.map → chunk-2FYJTSOP.js.map} +0 -0
  526. /package/dist/esm/{chunk-K3R4AH3E.js.map → chunk-3MWWP4MW.js.map} +0 -0
  527. /package/dist/esm/{chunk-HQ35PM4O.js.map → chunk-43A5GUSI.js.map} +0 -0
  528. /package/dist/esm/{chunk-Z5DQ6FSA.js.map → chunk-4AQTUBVP.js.map} +0 -0
  529. /package/dist/esm/{chunk-QLIELX4I.js.map → chunk-4ME6O27S.js.map} +0 -0
  530. /package/dist/esm/{chunk-JQOFJNCV.js.map → chunk-4YFJWXL2.js.map} +0 -0
  531. /package/dist/esm/{chunk-IPJUHVM6.js.map → chunk-666GX7O5.js.map} +0 -0
  532. /package/dist/esm/{chunk-7CBAHIVG.js.map → chunk-6IGTK4JE.js.map} +0 -0
  533. /package/dist/esm/{chunk-DJBPM5QK.js.map → chunk-7FC7HF76.js.map} +0 -0
  534. /package/dist/esm/{chunk-SVLY6B5F.js.map → chunk-7QDTSBJF.js.map} +0 -0
  535. /package/dist/esm/{chunk-7MURQ6CR.js.map → chunk-A2RZGGMY.js.map} +0 -0
  536. /package/dist/esm/{chunk-VF5TRT3H.js.map → chunk-AU3D6F42.js.map} +0 -0
  537. /package/dist/esm/{chunk-DK5MHD6I.js.map → chunk-B24BDVG2.js.map} +0 -0
  538. /package/dist/esm/{chunk-BJTJUIYJ.js.map → chunk-CRWYCLTE.js.map} +0 -0
  539. /package/dist/esm/{chunk-OHJVFZMH.js.map → chunk-CSKZZOI2.js.map} +0 -0
  540. /package/dist/esm/{chunk-4N5JU7XQ.js.map → chunk-CVWCKOHO.js.map} +0 -0
  541. /package/dist/esm/{chunk-ADYTQCZX.js.map → chunk-D6B7IMZU.js.map} +0 -0
  542. /package/dist/esm/{chunk-U7AASKZI.js.map → chunk-DNHUQLXO.js.map} +0 -0
  543. /package/dist/esm/{chunk-USGTBZ43.js.map → chunk-E67CIG6A.js.map} +0 -0
  544. /package/dist/esm/{chunk-YUZPSUJE.js.map → chunk-F7IYL2VW.js.map} +0 -0
  545. /package/dist/esm/{chunk-FVCWNSRU.js.map → chunk-FHOCUZDR.js.map} +0 -0
  546. /package/dist/esm/{chunk-APRBRAOT.js.map → chunk-FXUUI6Z2.js.map} +0 -0
  547. /package/dist/esm/{chunk-WNSPLWRV.js.map → chunk-GJSGKE7B.js.map} +0 -0
  548. /package/dist/esm/{chunk-OGOOZLUD.js.map → chunk-GLERJXVS.js.map} +0 -0
  549. /package/dist/esm/{chunk-6VGPTAHM.js.map → chunk-GWXVETMF.js.map} +0 -0
  550. /package/dist/esm/{chunk-ES7MK2MM.js.map → chunk-GYBLXQ4R.js.map} +0 -0
  551. /package/dist/esm/{chunk-4OBMRJHC.js.map → chunk-H7ST535H.js.map} +0 -0
  552. /package/dist/esm/{chunk-QLZ5XAW6.js.map → chunk-HF5WY5YE.js.map} +0 -0
  553. /package/dist/esm/{chunk-RDP4UQ42.js.map → chunk-IEWCQU2S.js.map} +0 -0
  554. /package/dist/esm/{chunk-XLOHPURR.js.map → chunk-IHK3H2OM.js.map} +0 -0
  555. /package/dist/esm/{chunk-EJWAAFCI.js.map → chunk-IKSN4RNB.js.map} +0 -0
  556. /package/dist/esm/{chunk-3F6I7YOR.js.map → chunk-JDGJSNWT.js.map} +0 -0
  557. /package/dist/esm/{chunk-ZSEFZM5H.js.map → chunk-K6QZMNCD.js.map} +0 -0
  558. /package/dist/esm/{chunk-ZHYOJNWV.js.map → chunk-LKAK5GXF.js.map} +0 -0
  559. /package/dist/esm/{chunk-GWYFT3EI.js.map → chunk-M24UXMOQ.js.map} +0 -0
  560. /package/dist/esm/{chunk-JCYI4NTV.js.map → chunk-MBCBP73P.js.map} +0 -0
  561. /package/dist/esm/{chunk-UYNYUR7O.js.map → chunk-MBE2YSBU.js.map} +0 -0
  562. /package/dist/esm/{chunk-DNI4QRXQ.js.map → chunk-MOR3NSXQ.js.map} +0 -0
  563. /package/dist/esm/{chunk-H2G446JG.js.map → chunk-NMKPFUNP.js.map} +0 -0
  564. /package/dist/esm/{chunk-TEULZKBM.js.map → chunk-OGXZHAQL.js.map} +0 -0
  565. /package/dist/esm/{chunk-M3ZYJANH.js.map → chunk-OSRJRBKP.js.map} +0 -0
  566. /package/dist/esm/{chunk-2AEELIG6.js.map → chunk-OWAUCLRT.js.map} +0 -0
  567. /package/dist/esm/{chunk-7CXVHFMQ.js.map → chunk-P7HYVJSU.js.map} +0 -0
  568. /package/dist/esm/{chunk-4532RT2B.js.map → chunk-P7IAHW4V.js.map} +0 -0
  569. /package/dist/esm/{chunk-GLC4QJBF.js.map → chunk-PLWXTEVE.js.map} +0 -0
  570. /package/dist/esm/{chunk-SGU4HUHF.js.map → chunk-PTLFMWCN.js.map} +0 -0
  571. /package/dist/esm/{chunk-QOWA5LK5.js.map → chunk-QEOAXJLN.js.map} +0 -0
  572. /package/dist/esm/{chunk-XHQGMOXV.js.map → chunk-RMKXWYOV.js.map} +0 -0
  573. /package/dist/esm/{chunk-WZCZHCVE.js.map → chunk-S56YSRHP.js.map} +0 -0
  574. /package/dist/esm/{chunk-E6IWYD3U.js.map → chunk-S5C5YRBS.js.map} +0 -0
  575. /package/dist/esm/{chunk-A24PYRVV.js.map → chunk-SO67YEVQ.js.map} +0 -0
  576. /package/dist/esm/{chunk-RQ2ZPMHJ.js.map → chunk-TOLLPRMM.js.map} +0 -0
  577. /package/dist/esm/{chunk-HACQF6F4.js.map → chunk-TOOSHJOA.js.map} +0 -0
  578. /package/dist/esm/{chunk-42HFGCHX.js.map → chunk-UGD7Z3L4.js.map} +0 -0
  579. /package/dist/esm/{chunk-DXI5P5O4.js.map → chunk-VX6ARMWP.js.map} +0 -0
  580. /package/dist/esm/{chunk-25U7DENY.js.map → chunk-W7N7V5YD.js.map} +0 -0
  581. /package/dist/esm/{chunk-6FAICIYS.js.map → chunk-XMRIRFM7.js.map} +0 -0
  582. /package/dist/esm/{chunk-UIEUZLZZ.js.map → chunk-ZY6SQWHT.js.map} +0 -0
@@ -3,8 +3,11 @@
3
3
  import * as React from 'react';
4
4
  import classNames from 'classnames';
5
5
  import { Direction, Slot, Tooltip as TooltipPrimitive } from 'radix-ui';
6
+ import { useComposedRefs, useLayoutEffect } from 'radix-ui/internal';
6
7
 
7
8
  import { getMatchingGrayColor } from '../helpers/get-matching-gray-color.js';
9
+ import { usePropSyncedState } from '../hooks/use-prop-synced-state.js';
10
+ import { useDeprecatedPanelBackgroundWarning } from '../helpers/use-deprecation-warning.js';
8
11
  import { themePropDefs } from './theme.props.js';
9
12
 
10
13
  import type { ThemeOwnProps } from './theme.props.js';
@@ -20,6 +23,9 @@ type ThemePanelBackground = (typeof themePropDefs.panelBackground.values)[number
20
23
  type ThemeRadius = (typeof themePropDefs.radius.values)[number];
21
24
  type ThemeScaling = (typeof themePropDefs.scaling.values)[number];
22
25
  type ThemeFontFamily = (typeof themePropDefs.fontFamily.values)[number];
26
+ // Headings follow the body font until something sets this, so `undefined` is a
27
+ // meaningful value here rather than a missing one.
28
+ type ThemeHeadingFontFamily = ThemeFontFamily | undefined;
23
29
 
24
30
  interface ThemeChangeHandlers {
25
31
  onAppearanceChange: (appearance: ThemeAppearance) => void;
@@ -30,6 +36,7 @@ interface ThemeChangeHandlers {
30
36
  onRadiusChange: (radius: ThemeRadius) => void;
31
37
  onScalingChange: (scaling: ThemeScaling) => void;
32
38
  onFontFamilyChange: (fontFamily: ThemeFontFamily) => void;
39
+ onHeadingFontFamilyChange: (headingFontFamily: ThemeHeadingFontFamily) => void;
33
40
  }
34
41
 
35
42
  interface ThemeContextValue extends ThemeChangeHandlers {
@@ -42,6 +49,7 @@ interface ThemeContextValue extends ThemeChangeHandlers {
42
49
  radius: ThemeRadius;
43
50
  scaling: ThemeScaling;
44
51
  fontFamily: ThemeFontFamily;
52
+ headingFontFamily: ThemeHeadingFontFamily;
45
53
  }
46
54
  // Default theme values used when components render outside a Theme provider
47
55
  const defaultThemeContext: ThemeContextValue = {
@@ -54,6 +62,7 @@ const defaultThemeContext: ThemeContextValue = {
54
62
  radius: themePropDefs.radius.default,
55
63
  scaling: themePropDefs.scaling.default,
56
64
  fontFamily: themePropDefs.fontFamily.default,
65
+ headingFontFamily: undefined,
57
66
  onAppearanceChange: noop,
58
67
  onAccentColorChange: noop,
59
68
  onGrayColorChange: noop,
@@ -62,6 +71,7 @@ const defaultThemeContext: ThemeContextValue = {
62
71
  onRadiusChange: noop,
63
72
  onScalingChange: noop,
64
73
  onFontFamilyChange: noop,
74
+ onHeadingFontFamilyChange: noop,
65
75
  };
66
76
 
67
77
  const ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined);
@@ -100,46 +110,33 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
100
110
  radius: radiusProp = themePropDefs.radius.default,
101
111
  scaling: scalingProp = themePropDefs.scaling.default,
102
112
  fontFamily: fontFamilyProp = themePropDefs.fontFamily.default,
113
+ headingFontFamily: headingFontFamilyProp,
103
114
  hasBackground = themePropDefs.hasBackground.default,
104
115
  ...rootProps
105
116
  } = props;
106
117
 
107
- // Show deprecation warning for panelBackground when used
108
- React.useEffect(() => {
109
- if (props.panelBackground !== undefined) {
110
- console.warn(
111
- 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',
112
- );
113
- }
114
- }, [props.panelBackground]);
118
+ useDeprecatedPanelBackgroundWarning(props.panelBackground);
115
119
 
116
- const [appearance, setAppearance] = React.useState(appearanceProp);
117
- React.useEffect(() => setAppearance(appearanceProp), [appearanceProp]);
118
-
119
- const [accentColor, setAccentColor] = React.useState(accentColorProp);
120
- React.useEffect(() => setAccentColor(accentColorProp), [accentColorProp]);
121
-
122
- const [grayColor, setGrayColor] = React.useState(grayColorProp);
123
- React.useEffect(() => setGrayColor(grayColorProp), [grayColorProp]);
120
+ // Each of these follows its prop but stays independently settable, so
121
+ // `ThemePanel` can change the theme at runtime. Syncing during render
122
+ // rather than in an effect matters here: an effect would commit the old
123
+ // theme first and re-render every consumer of the context a second time.
124
+ const [appearance, setAppearance] = usePropSyncedState(appearanceProp);
125
+ const [accentColor, setAccentColor] = usePropSyncedState(accentColorProp);
126
+ const [grayColor, setGrayColor] = usePropSyncedState(grayColorProp);
124
127
 
125
128
  // Material takes precedence over panelBackground
126
129
  const effectiveMaterial =
127
130
  materialProp !== themePropDefs.material.default ? materialProp : panelBackgroundProp;
128
- const [material, setMaterial] = React.useState(effectiveMaterial);
129
- React.useEffect(() => setMaterial(effectiveMaterial), [effectiveMaterial]);
131
+ const [material, setMaterial] = usePropSyncedState(effectiveMaterial);
130
132
 
131
133
  // Keep panelBackground in sync with material for backward compatibility
132
- const [panelBackground, setPanelBackground] = React.useState(panelBackgroundProp);
133
- React.useEffect(() => setPanelBackground(material), [material]);
134
-
135
- const [radius, setRadius] = React.useState(radiusProp);
136
- React.useEffect(() => setRadius(radiusProp), [radiusProp]);
137
-
138
- const [scaling, setScaling] = React.useState(scalingProp);
139
- React.useEffect(() => setScaling(scalingProp), [scalingProp]);
134
+ const [panelBackground, setPanelBackground] = usePropSyncedState(material);
140
135
 
141
- const [fontFamily, setFontFamily] = React.useState(fontFamilyProp);
142
- React.useEffect(() => setFontFamily(fontFamilyProp), [fontFamilyProp]);
136
+ const [radius, setRadius] = usePropSyncedState(radiusProp);
137
+ const [scaling, setScaling] = usePropSyncedState(scalingProp);
138
+ const [fontFamily, setFontFamily] = usePropSyncedState(fontFamilyProp);
139
+ const [headingFontFamily, setHeadingFontFamily] = usePropSyncedState(headingFontFamilyProp);
143
140
 
144
141
  return (
145
142
  <ThemeImpl
@@ -156,6 +153,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
156
153
  radius={radius}
157
154
  scaling={scaling}
158
155
  fontFamily={fontFamily}
156
+ headingFontFamily={headingFontFamily}
159
157
  //
160
158
  onAppearanceChange={setAppearance}
161
159
  onAccentColorChange={setAccentColor}
@@ -165,6 +163,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
165
163
  onRadiusChange={setRadius}
166
164
  onScalingChange={setScaling}
167
165
  onFontFamilyChange={setFontFamily}
166
+ onHeadingFontFamilyChange={setHeadingFontFamily}
168
167
  />
169
168
  );
170
169
  },
@@ -205,6 +204,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
205
204
  radius = props.radius ?? context?.radius ?? themePropDefs.radius.default,
206
205
  scaling = props.scaling ?? context?.scaling ?? themePropDefs.scaling.default,
207
206
  fontFamily = props.fontFamily ?? context?.fontFamily ?? themePropDefs.fontFamily.default,
207
+ headingFontFamily = props.headingFontFamily ?? context?.headingFontFamily,
208
208
  //
209
209
  onAppearanceChange = noop,
210
210
  onAccentColorChange = noop,
@@ -214,6 +214,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
214
214
  onRadiusChange = noop,
215
215
  onScalingChange = noop,
216
216
  onFontFamilyChange = noop,
217
+ onHeadingFontFamilyChange = noop,
217
218
  //
218
219
  ...themeProps
219
220
  } = props;
@@ -223,10 +224,24 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
223
224
  const hasBackground =
224
225
  hasBackgroundProp === undefined ? isRoot || isExplicitAppearance : hasBackgroundProp;
225
226
 
226
- const [clientOS, setClientOS] = React.useState<ReturnType<typeof getClientOS>>(undefined);
227
- React.useEffect(() => {
228
- if (isRoot) setClientOS(getClientOS());
229
- }, [isRoot]);
227
+ // `data-os` can only be resolved on the client. Writing it straight to the
228
+ // DOM keeps it out of the server markup — so hydration still matches — without
229
+ // spending a render pass, and a state update here would re-render the whole
230
+ // application on mount.
231
+ const rootRef = React.useRef<ThemeImplElement>(null);
232
+ const composedRef = useComposedRefs(forwardedRef, rootRef);
233
+ const hasExplicitOS = 'data-os' in themeProps;
234
+
235
+ useLayoutEffect(() => {
236
+ if (!isRoot || hasExplicitOS) return;
237
+ const node = rootRef.current;
238
+ if (!node) return;
239
+
240
+ const os = getClientOS();
241
+ if (!os) return;
242
+ node.setAttribute('data-os', os);
243
+ return () => node.removeAttribute('data-os');
244
+ }, [isRoot, hasExplicitOS]);
230
245
 
231
246
  return (
232
247
  <ThemeContext.Provider
@@ -241,6 +256,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
241
256
  radius,
242
257
  scaling,
243
258
  fontFamily,
259
+ headingFontFamily,
244
260
  //
245
261
  onAppearanceChange,
246
262
  onAccentColorChange,
@@ -250,6 +266,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
250
266
  onRadiusChange,
251
267
  onScalingChange,
252
268
  onFontFamilyChange,
269
+ onHeadingFontFamilyChange,
253
270
  }),
254
271
  [
255
272
  appearance,
@@ -261,6 +278,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
261
278
  radius,
262
279
  scaling,
263
280
  fontFamily,
281
+ headingFontFamily,
264
282
  //
265
283
  onAppearanceChange,
266
284
  onAccentColorChange,
@@ -270,6 +288,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
270
288
  onRadiusChange,
271
289
  onScalingChange,
272
290
  onFontFamilyChange,
291
+ onHeadingFontFamilyChange,
273
292
  ],
274
293
  )}
275
294
  >
@@ -284,8 +303,8 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
284
303
  data-radius={radius}
285
304
  data-scaling={scaling}
286
305
  data-font-family={fontFamily}
287
- data-os={isRoot ? clientOS : undefined}
288
- ref={forwardedRef}
306
+ data-heading-font-family={headingFontFamily}
307
+ ref={composedRef}
289
308
  {...themeProps}
290
309
  className={classNames(
291
310
  'radix-themes',
@@ -0,0 +1,121 @@
1
+ import type { PropDef } from '../props/prop-def.js';
2
+
3
+ /**
4
+ * A prop def pre-processed into the exact shape `extractProps` needs at render
5
+ * time. Everything that can be derived from the static prop def — enum
6
+ * membership sets, whether the def is responsive, whether it carries a default
7
+ * — is computed once here instead of on every render.
8
+ */
9
+ interface CompiledPropDef {
10
+ key: string;
11
+ type: PropDef['type'];
12
+ default: unknown;
13
+ hasDefault: boolean;
14
+ responsive: boolean;
15
+ className?: string;
16
+ customProperties?: `--${string}`[];
17
+ parseValue?: (value: string) => string | undefined;
18
+ /** The prop def's own enum values, kept for the responsive class name helpers. */
19
+ values: readonly string[];
20
+ /** O(1) membership for `values`. */
21
+ valueSet: ReadonlySet<string>;
22
+ /**
23
+ * `values` plus the default, used to coerce invalid enum values back to the
24
+ * default. Only present for `type: 'enum'` — `'enum | string'` props accept
25
+ * arbitrary strings and must not be coerced.
26
+ */
27
+ enumValueSet?: ReadonlySet<unknown>;
28
+ }
29
+
30
+ interface CompiledPropDefs {
31
+ /** Defs that contribute a class name and/or custom properties. */
32
+ styling: CompiledPropDef[];
33
+ /**
34
+ * Defs that pass through to the element but still need a default applied or
35
+ * an invalid enum value coerced. Defs that can do neither are omitted
36
+ * entirely — they are already correct as passed.
37
+ */
38
+ passthrough: CompiledPropDef[];
39
+ /** Keys consumed by `styling`, so they can be skipped when copying props. */
40
+ stylingKeys: ReadonlySet<string>;
41
+ }
42
+
43
+ const EMPTY_VALUES: readonly string[] = [];
44
+ const EMPTY_SET: ReadonlySet<string> = new Set();
45
+
46
+ function compile(propDefs: readonly Record<string, PropDef>[]): CompiledPropDefs {
47
+ const merged: Record<string, PropDef> = Object.assign({}, ...propDefs);
48
+ const styling: CompiledPropDef[] = [];
49
+ const passthrough: CompiledPropDef[] = [];
50
+ const stylingKeys = new Set<string>();
51
+
52
+ for (const key in merged) {
53
+ // The PropDef union is narrowed per-field below; reading the optional
54
+ // members off the union directly is what the runtime actually needs.
55
+ const def = merged[key] as PropDef & {
56
+ default?: unknown;
57
+ values?: readonly string[];
58
+ className?: string;
59
+ customProperties?: `--${string}`[];
60
+ parseValue?: (value: string) => string | undefined;
61
+ responsive?: true;
62
+ };
63
+
64
+ const values = def.values ?? EMPTY_VALUES;
65
+ const compiled: CompiledPropDef = {
66
+ key,
67
+ type: def.type,
68
+ default: def.default,
69
+ hasDefault: def.default !== undefined,
70
+ responsive: 'responsive' in def,
71
+ className: def.className,
72
+ customProperties: def.customProperties,
73
+ parseValue: def.parseValue,
74
+ values,
75
+ valueSet: values.length > 0 ? new Set(values) : EMPTY_SET,
76
+ enumValueSet: def.type === 'enum' ? new Set<unknown>([def.default, ...values]) : undefined,
77
+ };
78
+
79
+ if (def.className) {
80
+ styling.push(compiled);
81
+ stylingKeys.add(key);
82
+ } else if (compiled.hasDefault || def.type === 'enum') {
83
+ // Anything else is copied through untouched, so there is nothing to do.
84
+ passthrough.push(compiled);
85
+ }
86
+ }
87
+
88
+ return { styling, passthrough, stylingKeys };
89
+ }
90
+
91
+ interface CacheNode {
92
+ children: WeakMap<object, CacheNode>;
93
+ compiled?: CompiledPropDefs;
94
+ }
95
+
96
+ const cacheRoot: CacheNode = { children: new WeakMap() };
97
+
98
+ /**
99
+ * Compiles a set of prop defs, memoized on the identity of the prop def objects
100
+ * themselves. Components always pass the same module-level constants, so after
101
+ * the first render of a given component this is a couple of WeakMap lookups
102
+ * instead of merging 50-odd prop defs into a fresh object.
103
+ */
104
+ function getCompiledPropDefs(propDefs: readonly Record<string, PropDef>[]): CompiledPropDefs {
105
+ let node = cacheRoot;
106
+
107
+ for (let i = 0; i < propDefs.length; i++) {
108
+ const propDef = propDefs[i];
109
+ let child = node.children.get(propDef);
110
+ if (child === undefined) {
111
+ child = { children: new WeakMap() };
112
+ node.children.set(propDef, child);
113
+ }
114
+ node = child;
115
+ }
116
+
117
+ return (node.compiled ??= compile(propDefs));
118
+ }
119
+
120
+ export { getCompiledPropDefs };
121
+ export type { CompiledPropDef, CompiledPropDefs };
@@ -1,18 +1,41 @@
1
1
  import classNames from 'classnames';
2
2
 
3
+ import { getCompiledPropDefs } from './compile-prop-defs.js';
3
4
  import { getResponsiveClassNames, getResponsiveStyles } from './get-responsive-styles.js';
4
5
  import { isResponsiveObject } from './is-responsive-object.js';
5
6
  import { mergeStyles } from './merge-styles.js';
6
7
 
8
+ import type { CompiledPropDef } from './compile-prop-defs.js';
7
9
  import type * as React from 'react';
8
10
  import type { PropDef } from '../props/prop-def.js';
9
11
 
10
- type PropDefsWithClassName<T> = T extends Record<string, PropDef>
11
- ? { [K in keyof T]: T[K] extends { className: string } ? K : never }[keyof T]
12
- : never;
12
+ type PropDefsWithClassName<T> = T extends Record<string, PropDef> ? { [K in keyof T]: T[K] extends { className: string } ? K : never }[keyof T] : never;
13
13
 
14
- function mergePropDefs<T extends Record<string, PropDef>[]>(...args: T): Record<string, PropDef> {
15
- return Object.assign({}, ...args);
14
+ type ResponsiveValue = Record<string, string | undefined>;
15
+
16
+ /**
17
+ * Fills in the `initial` breakpoint of a responsive value from the prop def's
18
+ * default, and coerces an invalid `initial` enum value back to that default.
19
+ *
20
+ * Returns the value untouched when nothing needs changing, and a copy otherwise
21
+ * — callers routinely hoist responsive objects to module scope, so mutating the
22
+ * caller's object would corrupt it for every later render.
23
+ */
24
+ function normalizeResponsiveValue(value: ResponsiveValue, propDef: CompiledPropDef) {
25
+ let initial = value.initial;
26
+ let changed = false;
27
+
28
+ if (propDef.hasDefault && initial === undefined) {
29
+ initial = propDef.default as string | undefined;
30
+ changed = true;
31
+ }
32
+
33
+ if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(initial)) {
34
+ initial = propDef.default as string | undefined;
35
+ changed = true;
36
+ }
37
+
38
+ return changed ? { ...value, initial } : value;
16
39
  }
17
40
 
18
41
  /**
@@ -21,104 +44,102 @@ function mergePropDefs<T extends Record<string, PropDef>[]>(...args: T): Record<
21
44
  * the corresponding prop defs that were used to formulate the new `className`
22
45
  * and `style` values. Also applies prop def defaults to every prop.
23
46
  */
24
- function extractProps<
25
- P extends { className?: string; style?: React.CSSProperties; [key: string]: any },
26
- T extends Record<string, PropDef>[]
27
- >(
47
+ function extractProps<P extends { className?: string; style?: React.CSSProperties; [key: string]: any }, T extends Record<string, PropDef>[]>(
28
48
  props: P,
29
49
  ...propDefs: T
30
50
  ): Omit<P & { className?: string; style?: React.CSSProperties }, PropDefsWithClassName<T[number]>> {
31
- let className: string | undefined;
51
+ const { styling, passthrough, stylingKeys } = getCompiledPropDefs(propDefs);
52
+
53
+ // Copy the props that survive to the element rather than spreading and then
54
+ // deleting the styling keys. Deleting off a spread demotes the object to
55
+ // dictionary mode in V8, and this object is on the render path of every
56
+ // component in the library.
57
+ const extractedProps: Record<string, any> = {};
58
+ for (const key in props) {
59
+ if (stylingKeys.has(key)) continue;
60
+ extractedProps[key] = props[key];
61
+ }
62
+
63
+ for (let i = 0; i < passthrough.length; i++) {
64
+ const propDef = passthrough[i];
65
+ const value = extractedProps[propDef.key];
66
+
67
+ if (value === undefined) {
68
+ if (propDef.hasDefault) extractedProps[propDef.key] = propDef.default;
69
+ continue;
70
+ }
71
+
72
+ // Fall back to the default when the value is not a valid enum value
73
+ if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(value) && !isResponsiveObject(value)) {
74
+ extractedProps[propDef.key] = propDef.default;
75
+ }
76
+ }
77
+
32
78
  let style: ReturnType<typeof mergeStyles>;
33
- const extractedProps = { ...props };
34
- const allPropDefs = mergePropDefs(...propDefs);
79
+ const classes: string[] = [];
35
80
 
36
- for (const key in allPropDefs) {
37
- let value = extractedProps[key];
38
- const propDef = allPropDefs[key];
81
+ for (let i = 0; i < styling.length; i++) {
82
+ const propDef = styling[i];
83
+ let value = props[propDef.key];
39
84
 
40
85
  // Apply prop def defaults
41
- if (propDef.default !== undefined && value === undefined) {
86
+ if (value === undefined && propDef.hasDefault) {
42
87
  value = propDef.default;
43
88
  }
44
89
 
45
90
  // Apply the default value if the value is not a valid enum value
46
- if (propDef.type === 'enum') {
47
- const values = [propDef.default, ...propDef.values];
91
+ if (propDef.enumValueSet !== undefined && !propDef.enumValueSet.has(value) && !isResponsiveObject(value)) {
92
+ value = propDef.default;
93
+ }
48
94
 
49
- if (!values.includes(value) && !isResponsiveObject(value)) {
50
- value = propDef.default;
51
- }
95
+ if (!value) continue;
96
+
97
+ if (isResponsiveObject(value)) {
98
+ // Make sure we are not threading through responsive values for non-responsive prop defs
99
+ if (!propDef.responsive) continue;
100
+ value = normalizeResponsiveValue(value, propDef);
52
101
  }
53
102
 
54
- // Apply the value with defaults
55
- (extractedProps as Record<string, any>)[key] = value;
103
+ if (propDef.type === 'enum') {
104
+ const propClassName = getResponsiveClassNames({
105
+ allowArbitraryValues: false,
106
+ value,
107
+ className: propDef.className!,
108
+ propValues: propDef.values,
109
+ propValueSet: propDef.valueSet,
110
+ parseValue: propDef.parseValue,
111
+ });
112
+
113
+ if (propClassName) classes.push(propClassName);
114
+ continue;
115
+ }
56
116
 
57
- if ('className' in propDef && propDef.className) {
58
- delete extractedProps[key];
117
+ if (propDef.type === 'string' || propDef.type === 'enum | string') {
118
+ const [propClassNames, propCustomProperties] = getResponsiveStyles({
119
+ className: propDef.className!,
120
+ customProperties: propDef.customProperties!,
121
+ // `string` prop defs have no enum values, so every value is arbitrary
122
+ propValues: propDef.type === 'string' ? [] : propDef.values,
123
+ propValueSet: propDef.type === 'string' ? undefined : propDef.valueSet,
124
+ parseValue: propDef.parseValue,
125
+ value,
126
+ });
127
+
128
+ if (propCustomProperties) style = mergeStyles(style, propCustomProperties);
129
+ if (propClassNames) classes.push(propClassNames);
130
+ continue;
131
+ }
59
132
 
60
- const isResponsivePropDef = 'responsive' in propDef;
61
- // Make sure we are not threading through responsive values for non-responsive prop defs
62
- if (!value || (isResponsiveObject(value) && !isResponsivePropDef)) {
63
- continue;
64
- }
65
-
66
- if (isResponsiveObject(value)) {
67
- // Apply prop def defaults to the `initial` breakpoint
68
- if (propDef.default !== undefined && value.initial === undefined) {
69
- value.initial = propDef.default;
70
- }
71
-
72
- // Apply the default value to the `initial` breakpoint when it is not a valid enum value
73
- if (propDef.type === 'enum') {
74
- const values = [propDef.default, ...propDef.values];
75
-
76
- if (!values.includes(value.initial)) {
77
- value.initial = propDef.default;
78
- }
79
- }
80
- }
81
-
82
- if (propDef.type === 'enum') {
83
- const propClassName = getResponsiveClassNames({
84
- allowArbitraryValues: false,
85
- value,
86
- className: propDef.className,
87
- propValues: propDef.values,
88
- parseValue: propDef.parseValue,
89
- });
90
-
91
- className = classNames(className, propClassName);
92
- continue;
93
- }
94
-
95
- if (propDef.type === 'string' || propDef.type === 'enum | string') {
96
- const propDefValues = propDef.type === 'string' ? [] : propDef.values;
97
-
98
- const [propClassNames, propCustomProperties] = getResponsiveStyles({
99
- className: propDef.className,
100
- customProperties: propDef.customProperties,
101
- propValues: propDefValues,
102
- parseValue: propDef.parseValue,
103
- value,
104
- });
105
-
106
- style = mergeStyles(style, propCustomProperties);
107
- className = classNames(className, propClassNames);
108
- continue;
109
- }
110
-
111
- if (propDef.type === 'boolean' && value) {
112
- // TODO handle responsive boolean props
113
- className = classNames(className, propDef.className);
114
- continue;
115
- }
133
+ if (propDef.type === 'boolean') {
134
+ // TODO handle responsive boolean props
135
+ classes.push(propDef.className!);
136
+ continue;
116
137
  }
117
138
  }
118
139
 
119
- extractedProps.className = classNames(className, props.className);
140
+ extractedProps.className = classNames(classes.length > 0 ? classes.join(' ') : undefined, props.className);
120
141
  extractedProps.style = mergeStyles(style, props.style);
121
- return extractedProps;
142
+ return extractedProps as ReturnType<typeof extractProps<P, T>>;
122
143
  }
123
144
 
124
145
  export { extractProps };