@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
@@ -4,11 +4,21 @@ import { isResponsiveObject } from './is-responsive-object.js';
4
4
 
5
5
  import type { Responsive, Union } from '../props/prop-def.js';
6
6
 
7
+ /**
8
+ * Membership test against a prop def's enum values. Callers that already hold a
9
+ * compiled prop def pass `propValueSet` for an O(1) lookup; the handful of call
10
+ * sites that build options inline fall back to scanning the array.
11
+ */
12
+ function includesValue(propValues: string[] | readonly string[], propValueSet: ReadonlySet<string> | undefined, value: string): boolean {
13
+ return propValueSet !== undefined ? propValueSet.has(value) : propValues.includes(value);
14
+ }
15
+
7
16
  interface GetResponsiveStylesOptions {
8
17
  className: string;
9
18
  customProperties: `--${string}`[];
10
19
  value: Responsive<Union> | Responsive<string> | undefined;
11
20
  propValues: string[] | readonly string[];
21
+ propValueSet?: ReadonlySet<string>;
12
22
  parseValue?: (value: string) => string | undefined;
13
23
  }
14
24
 
@@ -28,28 +38,25 @@ interface GetResponsiveClassNamesOptions {
28
38
  className: string;
29
39
  value: Responsive<Union> | Responsive<string> | undefined;
30
40
  propValues: string[] | readonly string[];
41
+ propValueSet?: ReadonlySet<string>;
31
42
  parseValue?: (value: string) => string | undefined;
32
43
  }
33
44
 
34
- function getResponsiveClassNames({
35
- allowArbitraryValues,
36
- value,
37
- className,
38
- propValues,
39
- parseValue = (value) => value,
40
- }: GetResponsiveClassNamesOptions): string | undefined {
41
- const classNames: string[] = [];
42
-
45
+ function getResponsiveClassNames({ allowArbitraryValues, value, className, propValues, propValueSet, parseValue = (value) => value }: GetResponsiveClassNamesOptions): string | undefined {
43
46
  if (!value) {
44
47
  return undefined;
45
48
  }
46
49
 
47
- if (typeof value === 'string' && propValues.includes(value)) {
48
- return getBaseClassName(className, value, parseValue);
50
+ if (typeof value === 'string') {
51
+ if (includesValue(propValues, propValueSet, value)) {
52
+ return getBaseClassName(className, value, parseValue);
53
+ }
54
+ return allowArbitraryValues ? className : undefined;
49
55
  }
50
56
 
51
57
  if (isResponsiveObject(value)) {
52
58
  const object = value;
59
+ const classNames: string[] = [];
53
60
 
54
61
  for (const bp in object) {
55
62
  // Make sure we are not iterating over keys that aren't breakpoints
@@ -60,7 +67,7 @@ function getResponsiveClassNames({
60
67
  const value = object[bp];
61
68
 
62
69
  if (value !== undefined) {
63
- if (propValues.includes(value)) {
70
+ if (includesValue(propValues, propValueSet, value)) {
64
71
  const baseClassName = getBaseClassName(className, value, parseValue);
65
72
  const bpClassName = bp === 'initial' ? baseClassName : `${bp}:${baseClassName}`;
66
73
  classNames.push(bpClassName);
@@ -71,7 +78,7 @@ function getResponsiveClassNames({
71
78
  }
72
79
  }
73
80
 
74
- return classNames.join(' ');
81
+ return classNames.length > 0 ? classNames.join(' ') : '';
75
82
  }
76
83
 
77
84
  if (allowArbitraryValues) {
@@ -79,11 +86,7 @@ function getResponsiveClassNames({
79
86
  }
80
87
  }
81
88
 
82
- function getBaseClassName(
83
- className: string,
84
- value: string,
85
- parseValue: (value: string) => string | undefined
86
- ): string {
89
+ function getBaseClassName(className: string, value: string, parseValue: (value: string) => string | undefined): string {
87
90
  const delimiter = className ? '-' : '';
88
91
  const matchedValue = parseValue(value);
89
92
  const isNegative = matchedValue?.startsWith('-');
@@ -96,24 +99,25 @@ interface GetResponsiveCustomPropertiesOptions {
96
99
  customProperties: `--${string}`[];
97
100
  value: Responsive<Union> | Responsive<string> | undefined;
98
101
  propValues: string[] | readonly string[];
102
+ propValueSet?: ReadonlySet<string>;
99
103
  parseValue?: (value: string) => string | undefined;
100
104
  }
101
105
 
102
- function getResponsiveCustomProperties({
103
- customProperties,
104
- value,
105
- propValues,
106
- parseValue = (value) => value,
107
- }: GetResponsiveCustomPropertiesOptions) {
108
- let styles: Record<string, string | undefined> = {};
109
-
106
+ function getResponsiveCustomProperties({ customProperties, value, propValues, propValueSet, parseValue = (value) => value }: GetResponsiveCustomPropertiesOptions) {
110
107
  // Don't generate custom properties if the value is not arbitrary
111
- if (!value || (typeof value === 'string' && propValues.includes(value))) {
108
+ if (!value || (typeof value === 'string' && includesValue(propValues, propValueSet, value))) {
112
109
  return undefined;
113
110
  }
114
111
 
112
+ let styles: Record<string, string | undefined> | undefined;
113
+
115
114
  if (typeof value === 'string') {
116
- styles = Object.fromEntries(customProperties.map((prop) => [prop, value]));
115
+ const parsed = parseValue(value);
116
+ styles = {};
117
+ for (const customProperty of customProperties) {
118
+ styles[customProperty] = parsed;
119
+ }
120
+ return styles;
117
121
  }
118
122
 
119
123
  if (isResponsiveObject(value)) {
@@ -128,25 +132,20 @@ function getResponsiveCustomProperties({
128
132
  const value = object[bp];
129
133
 
130
134
  // Don't generate a custom property if the value is not arbitrary
131
- if (propValues.includes(value)) {
135
+ if (value === undefined || includesValue(propValues, propValueSet, value)) {
132
136
  continue;
133
137
  }
134
138
 
139
+ const parsed = parseValue(value);
140
+ styles ??= {};
135
141
  for (const customProperty of customProperties) {
136
142
  const bpProperty = bp === 'initial' ? customProperty : `${customProperty}-${bp}`;
137
- styles[bpProperty] = value;
143
+ styles[bpProperty] = parsed;
138
144
  }
139
145
  }
140
146
  }
141
147
 
142
- for (const key in styles) {
143
- const value = styles[key];
144
- if (value !== undefined) {
145
- styles[key] = parseValue(value);
146
- }
147
- }
148
-
149
- return styles;
148
+ return styles ?? {};
150
149
  }
151
150
 
152
151
  export { getResponsiveStyles, getResponsiveCustomProperties, getResponsiveClassNames };
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+
3
+ const PANEL_BACKGROUND_MESSAGE = 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.';
4
+
5
+ const warned = new Set<string>();
6
+
7
+ function warnOnce(message: string) {
8
+ if (warned.has(message)) return;
9
+ warned.add(message);
10
+ console.warn(message);
11
+ }
12
+
13
+ /**
14
+ * Warns, in development only, that `panelBackground` is deprecated.
15
+ *
16
+ * The `process.env.NODE_ENV` check is a compile-time constant, so a production
17
+ * bundle minifies the effect body away to an empty function instead of reading
18
+ * props and formatting a message per mounted component. The message is also
19
+ * logged once per session rather than once per component instance.
20
+ */
21
+ export function useDeprecatedPanelBackgroundWarning(panelBackground: unknown) {
22
+ React.useEffect(() => {
23
+ if (process.env.NODE_ENV === 'production') return;
24
+ if (panelBackground !== undefined) warnOnce(PANEL_BACKGROUND_MESSAGE);
25
+ }, [panelBackground]);
26
+ }
@@ -16,6 +16,20 @@ export function useBodyPointerEventsCleanup() {
16
16
 
17
17
  cleanupInstalled = true;
18
18
 
19
+ // Deferred cleanups are tracked so unmount can cancel the ones still
20
+ // queued. A timer that outlives the document reaches for `document.body`
21
+ // after it is gone; under jsdom that surfaces as an unhandled
22
+ // ReferenceError attributed to whichever test happened to be running.
23
+ const pending = new Set<ReturnType<typeof setTimeout>>();
24
+
25
+ const defer = (fn: () => void, delay: number) => {
26
+ const id = setTimeout(() => {
27
+ pending.delete(id);
28
+ fn();
29
+ }, delay);
30
+ pending.add(id);
31
+ };
32
+
19
33
  const hasOpenModal = (): boolean => {
20
34
  // Check for open dialogs/alertdialogs
21
35
  const hasDialogs = Boolean(
@@ -64,20 +78,20 @@ export function useBodyPointerEventsCleanup() {
64
78
  )
65
79
  ) {
66
80
  // Clicked outside any modal - force cleanup after a short delay
67
- setTimeout(forceCleanup, 100);
81
+ defer(forceCleanup, 100);
68
82
  }
69
83
  };
70
84
 
71
85
  // Force cleanup on ESC key
72
86
  const onEscapeKey = (event: KeyboardEvent) => {
73
87
  if (event.key === 'Escape') {
74
- setTimeout(forceCleanup, 200);
88
+ defer(forceCleanup, 200);
75
89
  }
76
90
  };
77
91
 
78
92
  // Safe cleanup on other interactions
79
93
  const onInteraction = () => {
80
- setTimeout(safeCleanup, 50);
94
+ defer(safeCleanup, 50);
81
95
  };
82
96
 
83
97
  // Install global listeners
@@ -89,7 +103,7 @@ export function useBodyPointerEventsCleanup() {
89
103
 
90
104
  // Watch for DOM changes that might indicate overlay removal
91
105
  const observer = new MutationObserver(() => {
92
- setTimeout(safeCleanup, 0);
106
+ defer(safeCleanup, 0);
93
107
  });
94
108
  observer.observe(document.body, { childList: true, subtree: true, attributes: true });
95
109
 
@@ -102,11 +116,27 @@ export function useBodyPointerEventsCleanup() {
102
116
  }, 1000);
103
117
 
104
118
  // Initial cleanup
105
- setTimeout(safeCleanup, 100);
119
+ defer(safeCleanup, 100);
106
120
 
107
- // Cleanup function (keep listeners for app lifetime)
121
+ // Tear everything down together. The observer is the important one: it
122
+ // fires while React unmounts the tree, so leaving it connected keeps
123
+ // queueing work against a document that is about to go away. Releasing the
124
+ // latch lets a later mount reinstall.
108
125
  return () => {
109
126
  clearInterval(intervalId);
127
+
128
+ pending.forEach(clearTimeout);
129
+ pending.clear();
130
+
131
+ observer.disconnect();
132
+
133
+ document.removeEventListener('click', onDocumentClick, true);
134
+ document.removeEventListener('keydown', onEscapeKey, true);
135
+ document.removeEventListener('pointerup', onInteraction, true);
136
+ document.removeEventListener('transitionend', onInteraction, true);
137
+ document.removeEventListener('animationend', onInteraction, true);
138
+
139
+ cleanupInstalled = false;
110
140
  };
111
141
  }, []);
112
142
  }
@@ -3,61 +3,102 @@
3
3
  import * as React from 'react';
4
4
  import { _BREAKPOINTS, type Breakpoint } from '../components/shell.types.js';
5
5
 
6
+ const QUERIES = Object.entries(_BREAKPOINTS) as Array<[Breakpoint, string]>;
7
+
8
+ type Listener = () => void;
9
+
6
10
  /**
7
- * Hook to get the current breakpoint based on window width.
8
- * Returns 'initial' on the server and during initial hydration.
9
- * Uses shared breakpoint values from shell.types.js.
11
+ * One set of `MediaQueryList`s and one set of listeners for the whole
12
+ * application. Every component that asks for the breakpoint used to create and
13
+ * subscribe to its own copy of all five queries.
10
14
  */
11
- export function useBreakpoint(): { breakpoint: Breakpoint; ready: boolean } {
12
- const [currentBp, setCurrentBp] = React.useState<Breakpoint>('initial');
13
- const [ready, setReady] = React.useState(false);
14
-
15
- React.useEffect(() => {
16
- if (typeof window === 'undefined') return;
17
-
18
- const queries = Object.entries(_BREAKPOINTS) as [keyof typeof _BREAKPOINTS, string][];
19
- const mqls = queries.map(([k, q]) => [k, window.matchMedia(q)] as const);
20
-
21
- // Accept optional event param to satisfy MediaQueryList listener signature
22
- const compute = (_e?: MediaQueryListEvent) => {
23
- // Highest matched wins
24
- const matched = mqls.filter(([, m]) => m.matches).map(([k]) => k);
25
- const next = (matched[matched.length - 1] as Breakpoint | undefined) ?? 'initial';
26
- setCurrentBp(next);
27
- setReady(true);
28
- };
29
-
30
- compute();
31
- const cleanups: Array<() => void> = [];
32
- mqls.forEach(([, m]) => {
33
- const mm = m as MediaQueryList & {
34
- addEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;
35
- removeEventListener?: (type: 'change', listener: (e: MediaQueryListEvent) => void) => void;
36
- addListener?: (listener: (e: MediaQueryListEvent) => void) => void;
37
- removeListener?: (listener: (e: MediaQueryListEvent) => void) => void;
38
- };
39
- if (typeof mm.addEventListener === 'function' && typeof mm.removeEventListener === 'function') {
40
- mm.addEventListener('change', compute);
41
- cleanups.push(() => mm.removeEventListener?.('change', compute));
42
- } else if (typeof mm.addListener === 'function' && typeof mm.removeListener === 'function') {
43
- mm.addListener(compute);
44
- cleanups.push(() => mm.removeListener?.(compute));
45
- }
46
- });
47
-
48
- return () => {
49
- cleanups.forEach((fn) => {
50
- try {
51
- fn();
52
- } catch (e) {
53
- // MediaQueryList cleanup can fail in edge cases (e.g., already removed)
54
- if (process.env.NODE_ENV !== 'production') {
55
- console.warn('[useBreakpoint] MediaQueryList cleanup warning:', e);
56
- }
15
+ let mediaQueryLists: Array<[Breakpoint, MediaQueryList]> | null = null;
16
+ const listeners = new Set<Listener>();
17
+ let cachedBreakpoint: Breakpoint | null = null;
18
+
19
+ function getMediaQueryLists() {
20
+ mediaQueryLists ??= QUERIES.map(([name, query]) => [name, window.matchMedia(query)] as [Breakpoint, MediaQueryList]);
21
+ return mediaQueryLists;
22
+ }
23
+
24
+ function computeBreakpoint(): Breakpoint {
25
+ // The largest matching query wins; `_BREAKPOINTS` is ordered smallest first.
26
+ let matched: Breakpoint = 'initial';
27
+ for (const [name, mql] of getMediaQueryLists()) {
28
+ if (mql.matches) matched = name;
29
+ }
30
+ return matched;
31
+ }
32
+
33
+ function handleChange() {
34
+ const next = computeBreakpoint();
35
+ if (next === cachedBreakpoint) return;
36
+ cachedBreakpoint = next;
37
+ listeners.forEach((listener) => listener());
38
+ }
39
+
40
+ function subscribe(listener: Listener) {
41
+ if (typeof window === 'undefined') return () => {};
42
+
43
+ if (listeners.size === 0) {
44
+ cachedBreakpoint = computeBreakpoint();
45
+ for (const [, mql] of getMediaQueryLists()) {
46
+ // Safari below 14 only has the deprecated listener API.
47
+ if (typeof mql.addEventListener === 'function') mql.addEventListener('change', handleChange);
48
+ else mql.addListener?.(handleChange);
49
+ }
50
+ }
51
+
52
+ listeners.add(listener);
53
+
54
+ return () => {
55
+ listeners.delete(listener);
56
+ if (listeners.size > 0) return;
57
+
58
+ for (const [, mql] of getMediaQueryLists()) {
59
+ try {
60
+ if (typeof mql.removeEventListener === 'function') mql.removeEventListener('change', handleChange);
61
+ else mql.removeListener?.(handleChange);
62
+ } catch (error) {
63
+ // Removal can throw in edge cases, e.g. the list was already torn down.
64
+ if (process.env.NODE_ENV !== 'production') {
65
+ console.warn('[useBreakpoint] MediaQueryList cleanup warning:', error);
57
66
  }
58
- });
59
- };
60
- }, []);
67
+ }
68
+ }
69
+ cachedBreakpoint = null;
70
+ };
71
+ }
72
+
73
+ /**
74
+ * `getSnapshot` must return a referentially stable value between changes, so it
75
+ * reads the cache that `handleChange` maintains rather than recomputing.
76
+ */
77
+ function getSnapshot(): Breakpoint {
78
+ if (typeof window === 'undefined') return 'initial';
79
+ cachedBreakpoint ??= computeBreakpoint();
80
+ return cachedBreakpoint;
81
+ }
82
+
83
+ function getServerSnapshot(): Breakpoint {
84
+ return 'initial';
85
+ }
86
+
87
+ const getReadySnapshot = () => true;
88
+ const getReadyServerSnapshot = () => false;
89
+
90
+ /**
91
+ * The current breakpoint, and whether it has been resolved against a real
92
+ * viewport yet (`false` on the server and during hydration).
93
+ *
94
+ * Reads through `useSyncExternalStore` rather than settling into state from an
95
+ * effect. On a client render the very first pass already has the real
96
+ * breakpoint, instead of rendering the whole shell at `initial` and correcting
97
+ * it after the browser has painted.
98
+ */
99
+ export function useBreakpoint(): { breakpoint: Breakpoint; ready: boolean } {
100
+ const breakpoint = React.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
101
+ const ready = React.useSyncExternalStore(subscribe, getReadySnapshot, getReadyServerSnapshot);
61
102
 
62
- return { breakpoint: currentBp, ready };
103
+ return React.useMemo(() => ({ breakpoint, ready }), [breakpoint, ready]);
63
104
  }
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * State that tracks a prop but can also be set imperatively — the shape `Theme`
5
+ * needs, where a prop sets the value and `ThemePanel` can change it at runtime.
6
+ *
7
+ * Adjusts state during render rather than syncing in a `useEffect`. An effect
8
+ * would commit one render carrying the *old* value and schedule a second one,
9
+ * which for a provider means every consumer renders twice and the browser can
10
+ * paint the stale value in between.
11
+ *
12
+ * @see https://react.dev/reference/react/useState#storing-information-from-previous-renders
13
+ */
14
+ export function usePropSyncedState<T>(propValue: T) {
15
+ const [value, setValue] = React.useState(propValue);
16
+ const [previousPropValue, setPreviousPropValue] = React.useState(propValue);
17
+
18
+ if (!Object.is(propValue, previousPropValue)) {
19
+ setPreviousPropValue(propValue);
20
+ setValue(propValue);
21
+ }
22
+
23
+ return [value, setValue] as const;
24
+ }
@@ -16,6 +16,34 @@
16
16
 
17
17
  [data-blur='none'] {
18
18
  --blur-factor: 0;
19
+
20
+ /*
21
+ * `backdrop-filter: blur(0px)` is not free. The browser still snapshots the
22
+ * backdrop, runs the filter and composites the result, so a zeroed blur
23
+ * factor alone costs as much per frame as a full blur. Only switching the
24
+ * property off entirely actually skips that work, so disable the filters
25
+ * rather than relying on the factor.
26
+ */
27
+ --backdrop-filter-components-enabled: none;
28
+ --backdrop-filter-panel-enabled: none;
29
+ --backdrop-filter-dialog-enabled: none;
30
+ }
31
+
32
+ /*
33
+ * Readers who have asked their OS to reduce transparency get the same
34
+ * treatment: no translucency to see, and none of the compositing cost.
35
+ */
36
+ @media (prefers-reduced-transparency: reduce) {
37
+ /*
38
+ * Deliberately not wrapped in `:where()`: this has to outrank the enabled
39
+ * values in tokens/constants.css, and a media query adds no specificity of
40
+ * its own.
41
+ */
42
+ .radix-themes {
43
+ --backdrop-filter-components-enabled: none;
44
+ --backdrop-filter-panel-enabled: none;
45
+ --backdrop-filter-dialog-enabled: none;
46
+ }
19
47
  }
20
48
 
21
49
  [data-blur='small'] {
@@ -149,9 +149,9 @@
149
149
  --color-panel: var(--color-panel-translucent);
150
150
  --color-surface: var(--color-surface-translucent);
151
151
  --color-dialog: var(--color-dialog-translucent);
152
- --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
153
- --backdrop-filter-components: blur(var(--backdrop-blur-components));
154
- --backdrop-filter-dialog: blur(var(--backdrop-blur-dialog));
152
+ --backdrop-filter-panel: var(--backdrop-filter-panel-enabled);
153
+ --backdrop-filter-components: var(--backdrop-filter-components-enabled);
154
+ --backdrop-filter-dialog: var(--backdrop-filter-dialog-enabled);
155
155
  /* Material system for component backgrounds */
156
156
  --material-blend: 60%;
157
157
  --material-alpha: 1;
@@ -10,6 +10,17 @@
10
10
  --backdrop-blur-panel: var(--blur-5);
11
11
  --backdrop-blur-dialog: var(--blur-6);
12
12
 
13
+ /*
14
+ * The filter a translucent surface uses when blur is enabled. Everything that
15
+ * opts into a backdrop filter reads one of these rather than writing
16
+ * `blur(...)` itself, so `[data-blur='none']` and
17
+ * `prefers-reduced-transparency` can switch the property off entirely — see
18
+ * tokens/blur.css.
19
+ */
20
+ --backdrop-filter-components-enabled: blur(var(--backdrop-blur-components));
21
+ --backdrop-filter-panel-enabled: blur(var(--backdrop-blur-panel));
22
+ --backdrop-filter-dialog-enabled: blur(var(--backdrop-blur-dialog));
23
+
13
24
  /* Surface background opacity constants - using new opacity tokens */
14
25
  --surface-opacity-light: var(--opacity-5);
15
26
  --surface-opacity-heavy: var(--opacity-6);