@womp/kookie-ui 0.3.24 → 0.3.26

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 (548) hide show
  1. package/components.css +159 -114
  2. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  3. package/dist/cjs/components/_internal/base-button.js +1 -1
  4. package/dist/cjs/components/_internal/base-button.js.map +4 -4
  5. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js +1 -1
  6. package/dist/cjs/components/_internal/dropdown-menu-drill-down.js.map +3 -3
  7. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  8. package/dist/cjs/components/_internal/shell-bottom.js.map +4 -4
  9. package/dist/cjs/components/_internal/shell-handles.d.ts.map +1 -1
  10. package/dist/cjs/components/_internal/shell-handles.js +1 -1
  11. package/dist/cjs/components/_internal/shell-handles.js.map +3 -3
  12. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  13. package/dist/cjs/components/_internal/shell-inspector.js.map +4 -4
  14. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  15. package/dist/cjs/components/_internal/shell-sidebar.js.map +4 -4
  16. package/dist/cjs/components/accordion.d.ts.map +1 -1
  17. package/dist/cjs/components/accordion.js +1 -1
  18. package/dist/cjs/components/accordion.js.map +4 -4
  19. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  20. package/dist/cjs/components/alert-dialog.js +1 -1
  21. package/dist/cjs/components/alert-dialog.js.map +4 -4
  22. package/dist/cjs/components/avatar.js +1 -1
  23. package/dist/cjs/components/avatar.js.map +4 -4
  24. package/dist/cjs/components/badge.d.ts.map +1 -1
  25. package/dist/cjs/components/badge.js +1 -1
  26. package/dist/cjs/components/badge.js.map +4 -4
  27. package/dist/cjs/components/blockquote.js +1 -1
  28. package/dist/cjs/components/blockquote.js.map +4 -4
  29. package/dist/cjs/components/box.js +1 -1
  30. package/dist/cjs/components/box.js.map +4 -4
  31. package/dist/cjs/components/button.js +1 -1
  32. package/dist/cjs/components/button.js.map +4 -4
  33. package/dist/cjs/components/callout.js +1 -1
  34. package/dist/cjs/components/callout.js.map +4 -4
  35. package/dist/cjs/components/card.js +1 -1
  36. package/dist/cjs/components/card.js.map +4 -4
  37. package/dist/cjs/components/chatbar.js +2 -2
  38. package/dist/cjs/components/chatbar.js.map +4 -4
  39. package/dist/cjs/components/checkbox-cards.js +1 -1
  40. package/dist/cjs/components/checkbox-cards.js.map +4 -4
  41. package/dist/cjs/components/checkbox-group.js +1 -1
  42. package/dist/cjs/components/checkbox-group.js.map +4 -4
  43. package/dist/cjs/components/checkbox.js +1 -1
  44. package/dist/cjs/components/checkbox.js.map +4 -4
  45. package/dist/cjs/components/code.js +1 -1
  46. package/dist/cjs/components/code.js.map +4 -4
  47. package/dist/cjs/components/combobox.js +1 -1
  48. package/dist/cjs/components/combobox.js.map +4 -4
  49. package/dist/cjs/components/container.js +1 -1
  50. package/dist/cjs/components/container.js.map +4 -4
  51. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  52. package/dist/cjs/components/context-menu.js +1 -1
  53. package/dist/cjs/components/context-menu.js.map +4 -4
  54. package/dist/cjs/components/data-list.js +1 -1
  55. package/dist/cjs/components/data-list.js.map +4 -4
  56. package/dist/cjs/components/dialog.d.ts.map +1 -1
  57. package/dist/cjs/components/dialog.js +1 -1
  58. package/dist/cjs/components/dialog.js.map +4 -4
  59. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  60. package/dist/cjs/components/dropdown-menu.js +1 -1
  61. package/dist/cjs/components/dropdown-menu.js.map +4 -4
  62. package/dist/cjs/components/em.js +1 -1
  63. package/dist/cjs/components/em.js.map +4 -4
  64. package/dist/cjs/components/flex.js +1 -1
  65. package/dist/cjs/components/flex.js.map +4 -4
  66. package/dist/cjs/components/grid.js +1 -1
  67. package/dist/cjs/components/grid.js.map +4 -4
  68. package/dist/cjs/components/heading.js +1 -1
  69. package/dist/cjs/components/heading.js.map +4 -4
  70. package/dist/cjs/components/hover-card.js +1 -1
  71. package/dist/cjs/components/hover-card.js.map +4 -4
  72. package/dist/cjs/components/icon-button.js +2 -2
  73. package/dist/cjs/components/icon-button.js.map +4 -4
  74. package/dist/cjs/components/image.js +1 -1
  75. package/dist/cjs/components/image.js.map +4 -4
  76. package/dist/cjs/components/index.js +5 -5
  77. package/dist/cjs/components/index.js.map +4 -4
  78. package/dist/cjs/components/inset.js +1 -1
  79. package/dist/cjs/components/inset.js.map +4 -4
  80. package/dist/cjs/components/kbd.js +1 -1
  81. package/dist/cjs/components/kbd.js.map +4 -4
  82. package/dist/cjs/components/link.js +1 -1
  83. package/dist/cjs/components/link.js.map +4 -4
  84. package/dist/cjs/components/navbar.js +1 -1
  85. package/dist/cjs/components/navbar.js.map +4 -4
  86. package/dist/cjs/components/popover.js +1 -1
  87. package/dist/cjs/components/popover.js.map +4 -4
  88. package/dist/cjs/components/progress.js +1 -1
  89. package/dist/cjs/components/progress.js.map +4 -4
  90. package/dist/cjs/components/quote.js +1 -1
  91. package/dist/cjs/components/quote.js.map +4 -4
  92. package/dist/cjs/components/radio-cards.js +1 -1
  93. package/dist/cjs/components/radio-cards.js.map +4 -4
  94. package/dist/cjs/components/radio-group.js +1 -1
  95. package/dist/cjs/components/radio-group.js.map +4 -4
  96. package/dist/cjs/components/radio.js +1 -1
  97. package/dist/cjs/components/radio.js.map +4 -4
  98. package/dist/cjs/components/schemas/base-button.schema.d.ts +2 -2
  99. package/dist/cjs/components/schemas/button.schema.d.ts +2 -2
  100. package/dist/cjs/components/schemas/icon-button.schema.d.ts +4 -4
  101. package/dist/cjs/components/schemas/shell.schema.d.ts +2 -2
  102. package/dist/cjs/components/schemas/toggle-button.schema.d.ts +6 -6
  103. package/dist/cjs/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  104. package/dist/cjs/components/scroll-area.js +1 -1
  105. package/dist/cjs/components/scroll-area.js.map +4 -4
  106. package/dist/cjs/components/section.js +1 -1
  107. package/dist/cjs/components/section.js.map +4 -4
  108. package/dist/cjs/components/segmented-control.js +1 -1
  109. package/dist/cjs/components/segmented-control.js.map +4 -4
  110. package/dist/cjs/components/select.js +1 -1
  111. package/dist/cjs/components/select.js.map +4 -4
  112. package/dist/cjs/components/separator.js +1 -1
  113. package/dist/cjs/components/separator.js.map +4 -4
  114. package/dist/cjs/components/sheet.d.ts.map +1 -1
  115. package/dist/cjs/components/sheet.js +1 -1
  116. package/dist/cjs/components/sheet.js.map +4 -4
  117. package/dist/cjs/components/shell.d.ts.map +1 -1
  118. package/dist/cjs/components/shell.js +1 -1
  119. package/dist/cjs/components/shell.js.map +4 -4
  120. package/dist/cjs/components/sidebar.js +1 -1
  121. package/dist/cjs/components/sidebar.js.map +4 -4
  122. package/dist/cjs/components/skeleton.js +1 -1
  123. package/dist/cjs/components/skeleton.js.map +4 -4
  124. package/dist/cjs/components/slider.js +1 -1
  125. package/dist/cjs/components/slider.js.map +4 -4
  126. package/dist/cjs/components/spinner.js +1 -1
  127. package/dist/cjs/components/spinner.js.map +4 -4
  128. package/dist/cjs/components/strong.js +1 -1
  129. package/dist/cjs/components/strong.js.map +4 -4
  130. package/dist/cjs/components/switch.js +1 -1
  131. package/dist/cjs/components/switch.js.map +4 -4
  132. package/dist/cjs/components/tab-nav.js +1 -1
  133. package/dist/cjs/components/tab-nav.js.map +4 -4
  134. package/dist/cjs/components/table.js +1 -1
  135. package/dist/cjs/components/table.js.map +4 -4
  136. package/dist/cjs/components/tabs.js +1 -1
  137. package/dist/cjs/components/tabs.js.map +4 -4
  138. package/dist/cjs/components/text-area.js +1 -1
  139. package/dist/cjs/components/text-area.js.map +4 -4
  140. package/dist/cjs/components/text-field.js +2 -2
  141. package/dist/cjs/components/text-field.js.map +4 -4
  142. package/dist/cjs/components/text.js +1 -1
  143. package/dist/cjs/components/text.js.map +4 -4
  144. package/dist/cjs/components/theme-panel.js +3 -3
  145. package/dist/cjs/components/theme-panel.js.map +4 -4
  146. package/dist/cjs/components/theme.d.ts.map +1 -1
  147. package/dist/cjs/components/theme.js +1 -1
  148. package/dist/cjs/components/theme.js.map +4 -4
  149. package/dist/cjs/components/toggle-button.js +2 -2
  150. package/dist/cjs/components/toggle-button.js.map +4 -4
  151. package/dist/cjs/components/toggle-icon-button.js +3 -3
  152. package/dist/cjs/components/toggle-icon-button.js.map +4 -4
  153. package/dist/cjs/components/toolbar.js +1 -1
  154. package/dist/cjs/components/toolbar.js.map +4 -4
  155. package/dist/cjs/components/tooltip.js +1 -1
  156. package/dist/cjs/components/tooltip.js.map +4 -4
  157. package/dist/cjs/components/user-card.js +1 -1
  158. package/dist/cjs/components/user-card.js.map +4 -4
  159. package/dist/cjs/helpers/compile-prop-defs.d.ts +49 -0
  160. package/dist/cjs/helpers/compile-prop-defs.d.ts.map +1 -0
  161. package/dist/cjs/helpers/compile-prop-defs.js +2 -0
  162. package/dist/cjs/helpers/compile-prop-defs.js.map +7 -0
  163. package/dist/cjs/helpers/extract-props.d.ts.map +1 -1
  164. package/dist/cjs/helpers/extract-props.js +1 -1
  165. package/dist/cjs/helpers/extract-props.js.map +4 -4
  166. package/dist/cjs/helpers/get-margin-styles.d.ts.map +1 -1
  167. package/dist/cjs/helpers/get-margin-styles.js +1 -1
  168. package/dist/cjs/helpers/get-margin-styles.js.map +3 -3
  169. package/dist/cjs/helpers/get-responsive-styles.d.ts +5 -2
  170. package/dist/cjs/helpers/get-responsive-styles.d.ts.map +1 -1
  171. package/dist/cjs/helpers/get-responsive-styles.js +1 -1
  172. package/dist/cjs/helpers/get-responsive-styles.js.map +3 -3
  173. package/dist/cjs/helpers/index.js +2 -2
  174. package/dist/cjs/helpers/index.js.map +4 -4
  175. package/dist/cjs/helpers/use-deprecation-warning.d.ts +10 -0
  176. package/dist/cjs/helpers/use-deprecation-warning.d.ts.map +1 -0
  177. package/dist/cjs/helpers/use-deprecation-warning.js +2 -0
  178. package/dist/cjs/helpers/use-deprecation-warning.js.map +7 -0
  179. package/dist/cjs/hooks/index.js +2 -2
  180. package/dist/cjs/hooks/index.js.map +3 -3
  181. package/dist/cjs/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  182. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js +1 -1
  183. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js.map +3 -3
  184. package/dist/cjs/hooks/use-breakpoint.d.ts +7 -3
  185. package/dist/cjs/hooks/use-breakpoint.d.ts.map +1 -1
  186. package/dist/cjs/hooks/use-breakpoint.js +1 -1
  187. package/dist/cjs/hooks/use-breakpoint.js.map +3 -3
  188. package/dist/cjs/hooks/use-prop-synced-state.d.ts +14 -0
  189. package/dist/cjs/hooks/use-prop-synced-state.d.ts.map +1 -0
  190. package/dist/cjs/hooks/use-prop-synced-state.js +2 -0
  191. package/dist/cjs/hooks/use-prop-synced-state.js.map +7 -0
  192. package/dist/cjs/index.js +5 -5
  193. package/dist/cjs/index.js.map +4 -4
  194. package/dist/esm/{chunk-RQ2ZPMHJ.js → chunk-22HGLMPQ.js} +2 -2
  195. package/dist/esm/{chunk-WYA4IRU6.js → chunk-25WZA7ZU.js} +2 -2
  196. package/dist/esm/chunk-2UPAYDKR.js +2 -0
  197. package/dist/esm/chunk-2UPAYDKR.js.map +7 -0
  198. package/dist/esm/{chunk-XHQGMOXV.js → chunk-36ZQVP7F.js} +2 -2
  199. package/dist/esm/{chunk-K3R4AH3E.js → chunk-3MWWP4MW.js} +2 -2
  200. package/dist/esm/{chunk-HQ35PM4O.js → chunk-43A5GUSI.js} +2 -2
  201. package/dist/esm/{chunk-Z5DQ6FSA.js → chunk-4AQTUBVP.js} +2 -2
  202. package/dist/esm/{chunk-25U7DENY.js → chunk-4BBOHEF4.js} +2 -2
  203. package/dist/esm/chunk-4CKDU6FY.js +2 -0
  204. package/dist/esm/chunk-4CKDU6FY.js.map +7 -0
  205. package/dist/esm/{chunk-ZSEFZM5H.js → chunk-4IY2PR6N.js} +2 -2
  206. package/dist/esm/{chunk-QLIELX4I.js → chunk-4ME6O27S.js} +2 -2
  207. package/dist/esm/chunk-4XJY6FIK.js +2 -0
  208. package/dist/esm/chunk-4XJY6FIK.js.map +7 -0
  209. package/dist/esm/{chunk-JQOFJNCV.js → chunk-4YFJWXL2.js} +2 -2
  210. package/dist/esm/{chunk-DNI4QRXQ.js → chunk-5IBGFL6O.js} +2 -2
  211. package/dist/esm/chunk-5TXQLK4G.js +2 -0
  212. package/dist/esm/chunk-5TXQLK4G.js.map +7 -0
  213. package/dist/esm/{chunk-IPJUHVM6.js → chunk-666GX7O5.js} +2 -2
  214. package/dist/esm/chunk-6FLLFCBU.js +2 -0
  215. package/dist/esm/chunk-6FLLFCBU.js.map +7 -0
  216. package/dist/esm/{chunk-DJBPM5QK.js → chunk-7FC7HF76.js} +2 -2
  217. package/dist/esm/{chunk-SVLY6B5F.js → chunk-7QDTSBJF.js} +2 -2
  218. package/dist/esm/chunk-AX5S56DS.js +2 -0
  219. package/dist/esm/chunk-AX5S56DS.js.map +7 -0
  220. package/dist/esm/{chunk-DK5MHD6I.js → chunk-B24BDVG2.js} +2 -2
  221. package/dist/esm/{chunk-WZCZHCVE.js → chunk-BJYUPIXO.js} +2 -2
  222. package/dist/esm/{chunk-BJTJUIYJ.js → chunk-CRWYCLTE.js} +2 -2
  223. package/dist/esm/{chunk-OHJVFZMH.js → chunk-CSKZZOI2.js} +2 -2
  224. package/dist/esm/chunk-D5N627TH.js +2 -0
  225. package/dist/esm/chunk-D5N627TH.js.map +7 -0
  226. package/dist/esm/{chunk-ADYTQCZX.js → chunk-D6B7IMZU.js} +2 -2
  227. package/dist/esm/chunk-DL2O3GKG.js +2 -0
  228. package/dist/esm/chunk-DL2O3GKG.js.map +7 -0
  229. package/dist/esm/{chunk-USGTBZ43.js → chunk-E67CIG6A.js} +2 -2
  230. package/dist/esm/{chunk-42HFGCHX.js → chunk-ETMLMDW4.js} +2 -2
  231. package/dist/esm/{chunk-7CBAHIVG.js → chunk-F2HYQ3ZR.js} +2 -2
  232. package/dist/esm/{chunk-YUZPSUJE.js → chunk-F7IYL2VW.js} +2 -2
  233. package/dist/esm/{chunk-FVCWNSRU.js → chunk-FHOCUZDR.js} +2 -2
  234. package/dist/esm/{chunk-7MURQ6CR.js → chunk-FLFAXVFB.js} +2 -2
  235. package/dist/esm/{chunk-APRBRAOT.js → chunk-FOEZLQTW.js} +2 -2
  236. package/dist/esm/{chunk-WNSPLWRV.js → chunk-GJSGKE7B.js} +2 -2
  237. package/dist/esm/{chunk-OGOOZLUD.js → chunk-GLERJXVS.js} +2 -2
  238. package/dist/esm/{chunk-6VGPTAHM.js → chunk-GWXVETMF.js} +2 -2
  239. package/dist/esm/{chunk-ES7MK2MM.js → chunk-GYBLXQ4R.js} +2 -2
  240. package/dist/esm/{chunk-4OBMRJHC.js → chunk-H7ST535H.js} +2 -2
  241. package/dist/esm/{chunk-QLZ5XAW6.js → chunk-HF5WY5YE.js} +2 -2
  242. package/dist/esm/chunk-ICIGZ3N7.js +2 -0
  243. package/dist/esm/chunk-ICIGZ3N7.js.map +7 -0
  244. package/dist/esm/{chunk-RDP4UQ42.js → chunk-IEWCQU2S.js} +2 -2
  245. package/dist/esm/{chunk-XLOHPURR.js → chunk-IHK3H2OM.js} +2 -2
  246. package/dist/esm/{chunk-3F6I7YOR.js → chunk-JDGJSNWT.js} +2 -2
  247. package/dist/esm/chunk-JQQIPEGY.js +2 -0
  248. package/dist/esm/chunk-JQQIPEGY.js.map +7 -0
  249. package/dist/esm/chunk-JR2YOGII.js +2 -0
  250. package/dist/esm/chunk-JR2YOGII.js.map +7 -0
  251. package/dist/esm/chunk-JUY7CBSL.js +2 -0
  252. package/dist/esm/chunk-JUY7CBSL.js.map +7 -0
  253. package/dist/esm/{chunk-VF5TRT3H.js → chunk-KKM6T5P7.js} +2 -2
  254. package/dist/esm/{chunk-ZHYOJNWV.js → chunk-LKAK5GXF.js} +2 -2
  255. package/dist/esm/chunk-LOGJJF4I.js +2 -0
  256. package/dist/esm/chunk-LOGJJF4I.js.map +7 -0
  257. package/dist/esm/{chunk-JCYI4NTV.js → chunk-MBCBP73P.js} +2 -2
  258. package/dist/esm/{chunk-UYNYUR7O.js → chunk-MBE2YSBU.js} +2 -2
  259. package/dist/esm/chunk-MHANZINI.js +2 -0
  260. package/dist/esm/chunk-MHANZINI.js.map +7 -0
  261. package/dist/esm/chunk-MRECKC4D.js +2 -0
  262. package/dist/esm/chunk-MRECKC4D.js.map +7 -0
  263. package/dist/esm/{chunk-H2G446JG.js → chunk-NMKPFUNP.js} +2 -2
  264. package/dist/esm/{chunk-4N5JU7XQ.js → chunk-O3CDWEZA.js} +2 -2
  265. package/dist/esm/{chunk-TEULZKBM.js → chunk-OGXZHAQL.js} +2 -2
  266. package/dist/esm/{chunk-2AEELIG6.js → chunk-OWAUCLRT.js} +2 -2
  267. package/dist/esm/{chunk-7CXVHFMQ.js → chunk-P7HYVJSU.js} +2 -2
  268. package/dist/esm/{chunk-4532RT2B.js → chunk-P7IAHW4V.js} +2 -2
  269. package/dist/esm/{chunk-M3ZYJANH.js → chunk-PQZXQ4ST.js} +2 -2
  270. package/dist/esm/{chunk-SGU4HUHF.js → chunk-PTLFMWCN.js} +2 -2
  271. package/dist/esm/chunk-S2HA3W3V.js +2 -0
  272. package/dist/esm/chunk-S2HA3W3V.js.map +7 -0
  273. package/dist/esm/{chunk-E6IWYD3U.js → chunk-S5C5YRBS.js} +2 -2
  274. package/dist/esm/{chunk-A24PYRVV.js → chunk-SO67YEVQ.js} +2 -2
  275. package/dist/esm/chunk-TLWTUKKL.js +2 -0
  276. package/dist/esm/chunk-TLWTUKKL.js.map +7 -0
  277. package/dist/esm/{chunk-HACQF6F4.js → chunk-TOOSHJOA.js} +2 -2
  278. package/dist/esm/{chunk-QOWA5LK5.js → chunk-U2X2CAW4.js} +2 -2
  279. package/dist/esm/{chunk-U7AASKZI.js → chunk-UVCH7QKO.js} +2 -2
  280. package/dist/esm/{chunk-GWYFT3EI.js → chunk-VLO7NXSP.js} +2 -2
  281. package/dist/esm/{chunk-DXI5P5O4.js → chunk-VX6ARMWP.js} +2 -2
  282. package/dist/esm/chunk-WAURCNAS.js +2 -0
  283. package/dist/esm/chunk-WAURCNAS.js.map +7 -0
  284. package/dist/esm/{chunk-EJWAAFCI.js → chunk-WO43WW3A.js} +2 -2
  285. package/dist/esm/{chunk-GLC4QJBF.js → chunk-WTYNFBFV.js} +2 -2
  286. package/dist/esm/{chunk-6FAICIYS.js → chunk-XMRIRFM7.js} +2 -2
  287. package/dist/esm/chunk-YV2KYHGR.js +2 -0
  288. package/dist/esm/chunk-YV2KYHGR.js.map +7 -0
  289. package/dist/esm/{chunk-UIEUZLZZ.js → chunk-ZY6SQWHT.js} +2 -2
  290. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  291. package/dist/esm/components/_internal/base-button.js +1 -1
  292. package/dist/esm/components/_internal/dropdown-menu-drill-down.js +1 -1
  293. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  294. package/dist/esm/components/_internal/shell-handles.d.ts.map +1 -1
  295. package/dist/esm/components/_internal/shell-handles.js +1 -1
  296. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  297. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  298. package/dist/esm/components/accordion.d.ts.map +1 -1
  299. package/dist/esm/components/accordion.js +1 -1
  300. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  301. package/dist/esm/components/alert-dialog.js +1 -1
  302. package/dist/esm/components/avatar.js +1 -1
  303. package/dist/esm/components/badge.d.ts.map +1 -1
  304. package/dist/esm/components/badge.js +1 -1
  305. package/dist/esm/components/blockquote.js +1 -1
  306. package/dist/esm/components/box.js +1 -1
  307. package/dist/esm/components/button.js +1 -1
  308. package/dist/esm/components/callout.js +1 -1
  309. package/dist/esm/components/card.js +1 -1
  310. package/dist/esm/components/chatbar.js +1 -1
  311. package/dist/esm/components/checkbox-cards.js +1 -1
  312. package/dist/esm/components/checkbox-group.js +1 -1
  313. package/dist/esm/components/checkbox.js +1 -1
  314. package/dist/esm/components/code.js +1 -1
  315. package/dist/esm/components/combobox.js +1 -1
  316. package/dist/esm/components/container.js +1 -1
  317. package/dist/esm/components/context-menu.d.ts.map +1 -1
  318. package/dist/esm/components/context-menu.js +1 -1
  319. package/dist/esm/components/data-list.js +1 -1
  320. package/dist/esm/components/dialog.d.ts.map +1 -1
  321. package/dist/esm/components/dialog.js +1 -1
  322. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  323. package/dist/esm/components/dropdown-menu.js +1 -1
  324. package/dist/esm/components/em.js +1 -1
  325. package/dist/esm/components/flex.js +1 -1
  326. package/dist/esm/components/grid.js +1 -1
  327. package/dist/esm/components/heading.js +1 -1
  328. package/dist/esm/components/hover-card.js +1 -1
  329. package/dist/esm/components/icon-button.js +1 -1
  330. package/dist/esm/components/image.js +1 -1
  331. package/dist/esm/components/index.js +1 -1
  332. package/dist/esm/components/inset.js +1 -1
  333. package/dist/esm/components/kbd.js +1 -1
  334. package/dist/esm/components/link.js +1 -1
  335. package/dist/esm/components/navbar.js +1 -1
  336. package/dist/esm/components/popover.js +1 -1
  337. package/dist/esm/components/progress.js +1 -1
  338. package/dist/esm/components/quote.js +1 -1
  339. package/dist/esm/components/radio-cards.js +1 -1
  340. package/dist/esm/components/radio-group.js +1 -1
  341. package/dist/esm/components/radio.js +1 -1
  342. package/dist/esm/components/schemas/base-button.schema.d.ts +2 -2
  343. package/dist/esm/components/schemas/button.schema.d.ts +2 -2
  344. package/dist/esm/components/schemas/icon-button.schema.d.ts +4 -4
  345. package/dist/esm/components/schemas/shell.schema.d.ts +2 -2
  346. package/dist/esm/components/schemas/toggle-button.schema.d.ts +6 -6
  347. package/dist/esm/components/schemas/toggle-icon-button.schema.d.ts +8 -8
  348. package/dist/esm/components/scroll-area.js +1 -1
  349. package/dist/esm/components/section.js +1 -1
  350. package/dist/esm/components/segmented-control.js +1 -1
  351. package/dist/esm/components/select.js +1 -1
  352. package/dist/esm/components/separator.js +1 -1
  353. package/dist/esm/components/sheet.d.ts.map +1 -1
  354. package/dist/esm/components/sheet.js +1 -1
  355. package/dist/esm/components/shell.d.ts.map +1 -1
  356. package/dist/esm/components/shell.js +1 -1
  357. package/dist/esm/components/sidebar.js +1 -1
  358. package/dist/esm/components/skeleton.js +1 -1
  359. package/dist/esm/components/slider.js +1 -1
  360. package/dist/esm/components/spinner.js +1 -1
  361. package/dist/esm/components/strong.js +1 -1
  362. package/dist/esm/components/switch.js +1 -1
  363. package/dist/esm/components/tab-nav.js +1 -1
  364. package/dist/esm/components/table.js +1 -1
  365. package/dist/esm/components/tabs.js +1 -1
  366. package/dist/esm/components/text-area.js +1 -1
  367. package/dist/esm/components/text-field.js +1 -1
  368. package/dist/esm/components/text.js +1 -1
  369. package/dist/esm/components/theme-panel.js +1 -1
  370. package/dist/esm/components/theme.d.ts.map +1 -1
  371. package/dist/esm/components/theme.js +1 -1
  372. package/dist/esm/components/toggle-button.js +1 -1
  373. package/dist/esm/components/toggle-icon-button.js +1 -1
  374. package/dist/esm/components/toolbar.js +1 -1
  375. package/dist/esm/components/tooltip.js +1 -1
  376. package/dist/esm/components/user-card.js +1 -1
  377. package/dist/esm/helpers/compile-prop-defs.d.ts +49 -0
  378. package/dist/esm/helpers/compile-prop-defs.d.ts.map +1 -0
  379. package/dist/esm/helpers/compile-prop-defs.js +2 -0
  380. package/dist/esm/helpers/compile-prop-defs.js.map +7 -0
  381. package/dist/esm/helpers/extract-props.d.ts.map +1 -1
  382. package/dist/esm/helpers/extract-props.js +1 -1
  383. package/dist/esm/helpers/get-margin-styles.d.ts.map +1 -1
  384. package/dist/esm/helpers/get-margin-styles.js +1 -1
  385. package/dist/esm/helpers/get-responsive-styles.d.ts +5 -2
  386. package/dist/esm/helpers/get-responsive-styles.d.ts.map +1 -1
  387. package/dist/esm/helpers/get-responsive-styles.js +1 -1
  388. package/dist/esm/helpers/index.js +1 -1
  389. package/dist/esm/helpers/use-deprecation-warning.d.ts +10 -0
  390. package/dist/esm/helpers/use-deprecation-warning.d.ts.map +1 -0
  391. package/dist/esm/helpers/use-deprecation-warning.js +2 -0
  392. package/dist/esm/helpers/use-deprecation-warning.js.map +7 -0
  393. package/dist/esm/hooks/index.js +1 -1
  394. package/dist/esm/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  395. package/dist/esm/hooks/use-body-pointer-events-cleanup.js +1 -1
  396. package/dist/esm/hooks/use-breakpoint.d.ts +7 -3
  397. package/dist/esm/hooks/use-breakpoint.d.ts.map +1 -1
  398. package/dist/esm/hooks/use-breakpoint.js +1 -1
  399. package/dist/esm/hooks/use-prop-synced-state.d.ts +14 -0
  400. package/dist/esm/hooks/use-prop-synced-state.d.ts.map +1 -0
  401. package/dist/esm/hooks/use-prop-synced-state.js +2 -0
  402. package/dist/esm/hooks/use-prop-synced-state.js.map +7 -0
  403. package/dist/esm/index.js +1 -1
  404. package/package.json +2 -1
  405. package/schemas/base-button.json +0 -1
  406. package/schemas/button.json +0 -1
  407. package/schemas/icon-button.json +0 -1
  408. package/schemas/index.json +0 -6
  409. package/schemas/toggle-button.json +0 -1
  410. package/schemas/toggle-icon-button.json +0 -1
  411. package/src/components/_internal/base-button.css +2 -2
  412. package/src/components/_internal/base-button.tsx +3 -58
  413. package/src/components/_internal/base-card.css +19 -4
  414. package/src/components/_internal/base-checkbox.css +2 -2
  415. package/src/components/_internal/base-dialog.css +7 -0
  416. package/src/components/_internal/base-menu.css +7 -0
  417. package/src/components/_internal/base-radio.css +2 -2
  418. package/src/components/_internal/base-sidebar.css +7 -0
  419. package/src/components/_internal/base-tab-list.css +2 -2
  420. package/src/components/_internal/shell-handles.tsx +27 -0
  421. package/src/components/accordion.css +6 -6
  422. package/src/components/accordion.tsx +2 -8
  423. package/src/components/alert-dialog.tsx +22 -20
  424. package/src/components/avatar.css +2 -2
  425. package/src/components/badge.css +2 -2
  426. package/src/components/badge.tsx +2 -8
  427. package/src/components/callout.css +2 -2
  428. package/src/components/chatbar.css +1 -1
  429. package/src/components/context-menu.tsx +2 -8
  430. package/src/components/dialog.tsx +22 -20
  431. package/src/components/dropdown-menu.tsx +2 -8
  432. package/src/components/popover.css +7 -0
  433. package/src/components/progress.css +21 -8
  434. package/src/components/segmented-control.css +2 -2
  435. package/src/components/select.css +9 -2
  436. package/src/components/sheet.tsx +31 -28
  437. package/src/components/shell.css +106 -69
  438. package/src/components/shell.tsx +28 -4
  439. package/src/components/slider.css +2 -2
  440. package/src/components/switch.css +2 -2
  441. package/src/components/table.css +7 -0
  442. package/src/components/text-area.css +2 -2
  443. package/src/components/text-field.css +2 -2
  444. package/src/components/theme.tsx +35 -34
  445. package/src/helpers/compile-prop-defs.ts +121 -0
  446. package/src/helpers/extract-props.ts +104 -83
  447. package/src/helpers/get-margin-styles.ts +38 -71
  448. package/src/helpers/get-responsive-styles.ts +37 -38
  449. package/src/helpers/use-deprecation-warning.ts +26 -0
  450. package/src/hooks/use-body-pointer-events-cleanup.ts +36 -6
  451. package/src/hooks/use-breakpoint.ts +94 -53
  452. package/src/hooks/use-prop-synced-state.ts +24 -0
  453. package/src/styles/tokens/blur.css +28 -0
  454. package/src/styles/tokens/color.css +3 -3
  455. package/src/styles/tokens/constants.css +11 -0
  456. package/styles.css +175 -117
  457. package/tokens/base.css +13 -3
  458. package/tokens.css +16 -3
  459. package/dist/esm/chunk-2SS3FA3N.js +0 -2
  460. package/dist/esm/chunk-2SS3FA3N.js.map +0 -7
  461. package/dist/esm/chunk-5U2Q23K3.js +0 -2
  462. package/dist/esm/chunk-5U2Q23K3.js.map +0 -7
  463. package/dist/esm/chunk-6ELPYR73.js +0 -2
  464. package/dist/esm/chunk-6ELPYR73.js.map +0 -7
  465. package/dist/esm/chunk-D2IX5LU6.js +0 -2
  466. package/dist/esm/chunk-D2IX5LU6.js.map +0 -7
  467. package/dist/esm/chunk-DZ4H2KTP.js +0 -2
  468. package/dist/esm/chunk-DZ4H2KTP.js.map +0 -7
  469. package/dist/esm/chunk-H4MMVAGQ.js +0 -2
  470. package/dist/esm/chunk-H4MMVAGQ.js.map +0 -7
  471. package/dist/esm/chunk-ITRVKLYU.js +0 -2
  472. package/dist/esm/chunk-ITRVKLYU.js.map +0 -7
  473. package/dist/esm/chunk-KCAFSCOV.js +0 -2
  474. package/dist/esm/chunk-KCAFSCOV.js.map +0 -7
  475. package/dist/esm/chunk-KMPBTEZH.js +0 -2
  476. package/dist/esm/chunk-KMPBTEZH.js.map +0 -7
  477. package/dist/esm/chunk-LN5SP46K.js +0 -2
  478. package/dist/esm/chunk-LN5SP46K.js.map +0 -7
  479. package/dist/esm/chunk-OKJNS7Z7.js +0 -2
  480. package/dist/esm/chunk-OKJNS7Z7.js.map +0 -7
  481. package/dist/esm/chunk-Q73Y5O5P.js +0 -2
  482. package/dist/esm/chunk-Q73Y5O5P.js.map +0 -7
  483. package/dist/esm/chunk-UUX42HBM.js +0 -2
  484. package/dist/esm/chunk-UUX42HBM.js.map +0 -7
  485. package/dist/esm/chunk-X7BD5FLE.js +0 -2
  486. package/dist/esm/chunk-X7BD5FLE.js.map +0 -7
  487. package/dist/esm/chunk-YEA646GM.js +0 -2
  488. package/dist/esm/chunk-YEA646GM.js.map +0 -7
  489. package/dist/esm/chunk-ZMEXIPWM.js +0 -2
  490. package/dist/esm/chunk-ZMEXIPWM.js.map +0 -7
  491. /package/dist/esm/{chunk-RQ2ZPMHJ.js.map → chunk-22HGLMPQ.js.map} +0 -0
  492. /package/dist/esm/{chunk-WYA4IRU6.js.map → chunk-25WZA7ZU.js.map} +0 -0
  493. /package/dist/esm/{chunk-XHQGMOXV.js.map → chunk-36ZQVP7F.js.map} +0 -0
  494. /package/dist/esm/{chunk-K3R4AH3E.js.map → chunk-3MWWP4MW.js.map} +0 -0
  495. /package/dist/esm/{chunk-HQ35PM4O.js.map → chunk-43A5GUSI.js.map} +0 -0
  496. /package/dist/esm/{chunk-Z5DQ6FSA.js.map → chunk-4AQTUBVP.js.map} +0 -0
  497. /package/dist/esm/{chunk-25U7DENY.js.map → chunk-4BBOHEF4.js.map} +0 -0
  498. /package/dist/esm/{chunk-ZSEFZM5H.js.map → chunk-4IY2PR6N.js.map} +0 -0
  499. /package/dist/esm/{chunk-QLIELX4I.js.map → chunk-4ME6O27S.js.map} +0 -0
  500. /package/dist/esm/{chunk-JQOFJNCV.js.map → chunk-4YFJWXL2.js.map} +0 -0
  501. /package/dist/esm/{chunk-DNI4QRXQ.js.map → chunk-5IBGFL6O.js.map} +0 -0
  502. /package/dist/esm/{chunk-IPJUHVM6.js.map → chunk-666GX7O5.js.map} +0 -0
  503. /package/dist/esm/{chunk-DJBPM5QK.js.map → chunk-7FC7HF76.js.map} +0 -0
  504. /package/dist/esm/{chunk-SVLY6B5F.js.map → chunk-7QDTSBJF.js.map} +0 -0
  505. /package/dist/esm/{chunk-DK5MHD6I.js.map → chunk-B24BDVG2.js.map} +0 -0
  506. /package/dist/esm/{chunk-WZCZHCVE.js.map → chunk-BJYUPIXO.js.map} +0 -0
  507. /package/dist/esm/{chunk-BJTJUIYJ.js.map → chunk-CRWYCLTE.js.map} +0 -0
  508. /package/dist/esm/{chunk-OHJVFZMH.js.map → chunk-CSKZZOI2.js.map} +0 -0
  509. /package/dist/esm/{chunk-ADYTQCZX.js.map → chunk-D6B7IMZU.js.map} +0 -0
  510. /package/dist/esm/{chunk-USGTBZ43.js.map → chunk-E67CIG6A.js.map} +0 -0
  511. /package/dist/esm/{chunk-42HFGCHX.js.map → chunk-ETMLMDW4.js.map} +0 -0
  512. /package/dist/esm/{chunk-7CBAHIVG.js.map → chunk-F2HYQ3ZR.js.map} +0 -0
  513. /package/dist/esm/{chunk-YUZPSUJE.js.map → chunk-F7IYL2VW.js.map} +0 -0
  514. /package/dist/esm/{chunk-FVCWNSRU.js.map → chunk-FHOCUZDR.js.map} +0 -0
  515. /package/dist/esm/{chunk-7MURQ6CR.js.map → chunk-FLFAXVFB.js.map} +0 -0
  516. /package/dist/esm/{chunk-APRBRAOT.js.map → chunk-FOEZLQTW.js.map} +0 -0
  517. /package/dist/esm/{chunk-WNSPLWRV.js.map → chunk-GJSGKE7B.js.map} +0 -0
  518. /package/dist/esm/{chunk-OGOOZLUD.js.map → chunk-GLERJXVS.js.map} +0 -0
  519. /package/dist/esm/{chunk-6VGPTAHM.js.map → chunk-GWXVETMF.js.map} +0 -0
  520. /package/dist/esm/{chunk-ES7MK2MM.js.map → chunk-GYBLXQ4R.js.map} +0 -0
  521. /package/dist/esm/{chunk-4OBMRJHC.js.map → chunk-H7ST535H.js.map} +0 -0
  522. /package/dist/esm/{chunk-QLZ5XAW6.js.map → chunk-HF5WY5YE.js.map} +0 -0
  523. /package/dist/esm/{chunk-RDP4UQ42.js.map → chunk-IEWCQU2S.js.map} +0 -0
  524. /package/dist/esm/{chunk-XLOHPURR.js.map → chunk-IHK3H2OM.js.map} +0 -0
  525. /package/dist/esm/{chunk-3F6I7YOR.js.map → chunk-JDGJSNWT.js.map} +0 -0
  526. /package/dist/esm/{chunk-VF5TRT3H.js.map → chunk-KKM6T5P7.js.map} +0 -0
  527. /package/dist/esm/{chunk-ZHYOJNWV.js.map → chunk-LKAK5GXF.js.map} +0 -0
  528. /package/dist/esm/{chunk-JCYI4NTV.js.map → chunk-MBCBP73P.js.map} +0 -0
  529. /package/dist/esm/{chunk-UYNYUR7O.js.map → chunk-MBE2YSBU.js.map} +0 -0
  530. /package/dist/esm/{chunk-H2G446JG.js.map → chunk-NMKPFUNP.js.map} +0 -0
  531. /package/dist/esm/{chunk-4N5JU7XQ.js.map → chunk-O3CDWEZA.js.map} +0 -0
  532. /package/dist/esm/{chunk-TEULZKBM.js.map → chunk-OGXZHAQL.js.map} +0 -0
  533. /package/dist/esm/{chunk-2AEELIG6.js.map → chunk-OWAUCLRT.js.map} +0 -0
  534. /package/dist/esm/{chunk-7CXVHFMQ.js.map → chunk-P7HYVJSU.js.map} +0 -0
  535. /package/dist/esm/{chunk-4532RT2B.js.map → chunk-P7IAHW4V.js.map} +0 -0
  536. /package/dist/esm/{chunk-M3ZYJANH.js.map → chunk-PQZXQ4ST.js.map} +0 -0
  537. /package/dist/esm/{chunk-SGU4HUHF.js.map → chunk-PTLFMWCN.js.map} +0 -0
  538. /package/dist/esm/{chunk-E6IWYD3U.js.map → chunk-S5C5YRBS.js.map} +0 -0
  539. /package/dist/esm/{chunk-A24PYRVV.js.map → chunk-SO67YEVQ.js.map} +0 -0
  540. /package/dist/esm/{chunk-HACQF6F4.js.map → chunk-TOOSHJOA.js.map} +0 -0
  541. /package/dist/esm/{chunk-QOWA5LK5.js.map → chunk-U2X2CAW4.js.map} +0 -0
  542. /package/dist/esm/{chunk-U7AASKZI.js.map → chunk-UVCH7QKO.js.map} +0 -0
  543. /package/dist/esm/{chunk-GWYFT3EI.js.map → chunk-VLO7NXSP.js.map} +0 -0
  544. /package/dist/esm/{chunk-DXI5P5O4.js.map → chunk-VX6ARMWP.js.map} +0 -0
  545. /package/dist/esm/{chunk-EJWAAFCI.js.map → chunk-WO43WW3A.js.map} +0 -0
  546. /package/dist/esm/{chunk-GLC4QJBF.js.map → chunk-WTYNFBFV.js.map} +0 -0
  547. /package/dist/esm/{chunk-6FAICIYS.js.map → chunk-XMRIRFM7.js.map} +0 -0
  548. /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';
@@ -104,42 +107,27 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
104
107
  ...rootProps
105
108
  } = props;
106
109
 
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]);
110
+ useDeprecatedPanelBackgroundWarning(props.panelBackground);
115
111
 
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]);
112
+ // Each of these follows its prop but stays independently settable, so
113
+ // `ThemePanel` can change the theme at runtime. Syncing during render
114
+ // rather than in an effect matters here: an effect would commit the old
115
+ // theme first and re-render every consumer of the context a second time.
116
+ const [appearance, setAppearance] = usePropSyncedState(appearanceProp);
117
+ const [accentColor, setAccentColor] = usePropSyncedState(accentColorProp);
118
+ const [grayColor, setGrayColor] = usePropSyncedState(grayColorProp);
124
119
 
125
120
  // Material takes precedence over panelBackground
126
121
  const effectiveMaterial =
127
122
  materialProp !== themePropDefs.material.default ? materialProp : panelBackgroundProp;
128
- const [material, setMaterial] = React.useState(effectiveMaterial);
129
- React.useEffect(() => setMaterial(effectiveMaterial), [effectiveMaterial]);
123
+ const [material, setMaterial] = usePropSyncedState(effectiveMaterial);
130
124
 
131
125
  // 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]);
126
+ const [panelBackground, setPanelBackground] = usePropSyncedState(material);
140
127
 
141
- const [fontFamily, setFontFamily] = React.useState(fontFamilyProp);
142
- React.useEffect(() => setFontFamily(fontFamilyProp), [fontFamilyProp]);
128
+ const [radius, setRadius] = usePropSyncedState(radiusProp);
129
+ const [scaling, setScaling] = usePropSyncedState(scalingProp);
130
+ const [fontFamily, setFontFamily] = usePropSyncedState(fontFamilyProp);
143
131
 
144
132
  return (
145
133
  <ThemeImpl
@@ -223,10 +211,24 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
223
211
  const hasBackground =
224
212
  hasBackgroundProp === undefined ? isRoot || isExplicitAppearance : hasBackgroundProp;
225
213
 
226
- const [clientOS, setClientOS] = React.useState<ReturnType<typeof getClientOS>>(undefined);
227
- React.useEffect(() => {
228
- if (isRoot) setClientOS(getClientOS());
229
- }, [isRoot]);
214
+ // `data-os` can only be resolved on the client. Writing it straight to the
215
+ // DOM keeps it out of the server markup — so hydration still matches — without
216
+ // spending a render pass, and a state update here would re-render the whole
217
+ // application on mount.
218
+ const rootRef = React.useRef<ThemeImplElement>(null);
219
+ const composedRef = useComposedRefs(forwardedRef, rootRef);
220
+ const hasExplicitOS = 'data-os' in themeProps;
221
+
222
+ useLayoutEffect(() => {
223
+ if (!isRoot || hasExplicitOS) return;
224
+ const node = rootRef.current;
225
+ if (!node) return;
226
+
227
+ const os = getClientOS();
228
+ if (!os) return;
229
+ node.setAttribute('data-os', os);
230
+ return () => node.removeAttribute('data-os');
231
+ }, [isRoot, hasExplicitOS]);
230
232
 
231
233
  return (
232
234
  <ThemeContext.Provider
@@ -284,8 +286,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
284
286
  data-radius={radius}
285
287
  data-scaling={scaling}
286
288
  data-font-family={fontFamily}
287
- data-os={isRoot ? clientOS : undefined}
288
- ref={forwardedRef}
289
+ ref={composedRef}
289
290
  {...themeProps}
290
291
  className={classNames(
291
292
  '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 };
@@ -1,5 +1,3 @@
1
- import classNames from 'classnames';
2
-
3
1
  import { getResponsiveStyles } from './get-responsive-styles.js';
4
2
  import { mergeStyles } from './merge-styles.js';
5
3
  import { marginPropDefs } from '../props/margin.props.js';
@@ -7,75 +5,44 @@ import { marginPropDefs } from '../props/margin.props.js';
7
5
  import type { MarginProps } from '../props/margin.props.js';
8
6
 
9
7
  const marginValues = marginPropDefs.m.values;
8
+ const marginValueSet: ReadonlySet<string> = new Set(marginValues);
9
+
10
+ // Static table so the common case — a component with no margin props at all —
11
+ // is seven property reads and nothing else.
12
+ const MARGIN_PROPS: ReadonlyArray<{
13
+ key: keyof MarginProps;
14
+ className: string;
15
+ customProperties: `--${string}`[];
16
+ }> = [
17
+ { key: 'm', className: 'rt-r-m', customProperties: ['--margin'] },
18
+ { key: 'mx', className: 'rt-r-mx', customProperties: ['--margin-left', '--margin-right'] },
19
+ { key: 'my', className: 'rt-r-my', customProperties: ['--margin-top', '--margin-bottom'] },
20
+ { key: 'mt', className: 'rt-r-mt', customProperties: ['--margin-top'] },
21
+ { key: 'mr', className: 'rt-r-mr', customProperties: ['--margin-right'] },
22
+ { key: 'mb', className: 'rt-r-mb', customProperties: ['--margin-bottom'] },
23
+ { key: 'ml', className: 'rt-r-ml', customProperties: ['--margin-left'] },
24
+ ];
10
25
 
11
26
  export function getMarginStyles(props: MarginProps) {
12
- const [mClassNames, mCustomProperties] = getResponsiveStyles({
13
- className: 'rt-r-m',
14
- customProperties: ['--margin'],
15
- propValues: marginValues,
16
- value: props.m,
17
- });
18
-
19
- const [mxClassNames, mxCustomProperties] = getResponsiveStyles({
20
- className: 'rt-r-mx',
21
- customProperties: ['--margin-left', '--margin-right'],
22
- propValues: marginValues,
23
- value: props.mx,
24
- });
25
-
26
- const [myClassNames, myCustomProperties] = getResponsiveStyles({
27
- className: 'rt-r-my',
28
- customProperties: ['--margin-top', '--margin-bottom'],
29
- propValues: marginValues,
30
- value: props.my,
31
- });
32
-
33
- const [mtClassNames, mtCustomProperties] = getResponsiveStyles({
34
- className: 'rt-r-mt',
35
- customProperties: ['--margin-top'],
36
- propValues: marginValues,
37
- value: props.mt,
38
- });
39
-
40
- const [mrClassNames, mrCustomProperties] = getResponsiveStyles({
41
- className: 'rt-r-mr',
42
- customProperties: ['--margin-right'],
43
- propValues: marginValues,
44
- value: props.mr,
45
- });
46
-
47
- const [mbClassNames, mbCustomProperties] = getResponsiveStyles({
48
- className: 'rt-r-mb',
49
- customProperties: ['--margin-bottom'],
50
- propValues: marginValues,
51
- value: props.mb,
52
- });
53
-
54
- const [mlClassNames, mlCustomProperties] = getResponsiveStyles({
55
- className: 'rt-r-ml',
56
- customProperties: ['--margin-left'],
57
- propValues: marginValues,
58
- value: props.ml,
59
- });
60
-
61
- return [
62
- classNames(
63
- mClassNames,
64
- mxClassNames,
65
- myClassNames,
66
- mtClassNames,
67
- mrClassNames,
68
- mbClassNames,
69
- mlClassNames
70
- ),
71
- mergeStyles(
72
- mCustomProperties,
73
- mxCustomProperties,
74
- myCustomProperties,
75
- mtCustomProperties,
76
- mrCustomProperties,
77
- mbCustomProperties,
78
- mlCustomProperties
79
- ),
80
- ] as const;
27
+ let classes: string[] | undefined;
28
+ let style: ReturnType<typeof mergeStyles>;
29
+
30
+ for (let i = 0; i < MARGIN_PROPS.length; i++) {
31
+ const { key, className, customProperties } = MARGIN_PROPS[i];
32
+ const value = props[key];
33
+ if (value === undefined) continue;
34
+
35
+ const [propClassNames, propCustomProperties] = getResponsiveStyles({
36
+ className,
37
+ customProperties,
38
+ propValues: marginValues,
39
+ propValueSet: marginValueSet,
40
+ value,
41
+ });
42
+
43
+ if (propClassNames) (classes ??= []).push(propClassNames);
44
+ if (propCustomProperties) style = mergeStyles(style, propCustomProperties);
45
+ }
46
+
47
+ return [classes !== undefined ? classes.join(' ') : '', style] as const;
81
48
  }