@kushagradhawan/kookie-ui 0.1.29 → 0.1.30

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 (522) hide show
  1. package/components.css +4083 -2224
  2. package/dist/cjs/components/_internal/base-button.d.ts +36 -0
  3. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  4. package/dist/cjs/components/_internal/base-button.js +1 -1
  5. package/dist/cjs/components/_internal/base-button.js.map +3 -3
  6. package/dist/cjs/components/_internal/base-button.props.d.ts +61 -0
  7. package/dist/cjs/components/_internal/base-button.props.d.ts.map +1 -1
  8. package/dist/cjs/components/_internal/base-button.props.js +1 -1
  9. package/dist/cjs/components/_internal/base-button.props.js.map +3 -3
  10. package/dist/cjs/components/_internal/base-checkbox.props.d.ts +6 -1
  11. package/dist/cjs/components/_internal/base-checkbox.props.d.ts.map +1 -1
  12. package/dist/cjs/components/_internal/base-checkbox.props.js +1 -1
  13. package/dist/cjs/components/_internal/base-checkbox.props.js.map +3 -3
  14. package/dist/cjs/components/_internal/base-menu.props.d.ts +8 -0
  15. package/dist/cjs/components/_internal/base-menu.props.d.ts.map +1 -1
  16. package/dist/cjs/components/_internal/base-menu.props.js +1 -1
  17. package/dist/cjs/components/_internal/base-menu.props.js.map +3 -3
  18. package/dist/cjs/components/_internal/base-radio.props.d.ts +6 -1
  19. package/dist/cjs/components/_internal/base-radio.props.d.ts.map +1 -1
  20. package/dist/cjs/components/_internal/base-radio.props.js +1 -1
  21. package/dist/cjs/components/_internal/base-radio.props.js.map +3 -3
  22. package/dist/cjs/components/accordion.d.ts.map +1 -1
  23. package/dist/cjs/components/accordion.js +1 -1
  24. package/dist/cjs/components/accordion.js.map +3 -3
  25. package/dist/cjs/components/accordion.props.d.ts +9 -0
  26. package/dist/cjs/components/accordion.props.d.ts.map +1 -1
  27. package/dist/cjs/components/accordion.props.js +1 -1
  28. package/dist/cjs/components/accordion.props.js.map +2 -2
  29. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  30. package/dist/cjs/components/alert-dialog.js +1 -1
  31. package/dist/cjs/components/alert-dialog.js.map +3 -3
  32. package/dist/cjs/components/alert-dialog.props.d.ts +69 -2
  33. package/dist/cjs/components/alert-dialog.props.d.ts.map +1 -1
  34. package/dist/cjs/components/alert-dialog.props.js +1 -1
  35. package/dist/cjs/components/alert-dialog.props.js.map +3 -3
  36. package/dist/cjs/components/avatar.d.ts.map +1 -1
  37. package/dist/cjs/components/avatar.js +1 -1
  38. package/dist/cjs/components/avatar.js.map +3 -3
  39. package/dist/cjs/components/avatar.props.d.ts +9 -1
  40. package/dist/cjs/components/avatar.props.d.ts.map +1 -1
  41. package/dist/cjs/components/avatar.props.js +1 -1
  42. package/dist/cjs/components/avatar.props.js.map +3 -3
  43. package/dist/cjs/components/badge.d.ts +8 -1
  44. package/dist/cjs/components/badge.d.ts.map +1 -1
  45. package/dist/cjs/components/badge.js +1 -1
  46. package/dist/cjs/components/badge.js.map +3 -3
  47. package/dist/cjs/components/badge.props.d.ts +14 -6
  48. package/dist/cjs/components/badge.props.d.ts.map +1 -1
  49. package/dist/cjs/components/badge.props.js +1 -1
  50. package/dist/cjs/components/badge.props.js.map +3 -3
  51. package/dist/cjs/components/blockquote.props.d.ts +1 -1
  52. package/dist/cjs/components/button.d.ts +53 -1
  53. package/dist/cjs/components/button.d.ts.map +1 -1
  54. package/dist/cjs/components/button.js +1 -1
  55. package/dist/cjs/components/button.js.map +3 -3
  56. package/dist/cjs/components/button.props.d.ts +17 -0
  57. package/dist/cjs/components/button.props.d.ts.map +1 -1
  58. package/dist/cjs/components/button.props.js.map +2 -2
  59. package/dist/cjs/components/callout.d.ts +4 -0
  60. package/dist/cjs/components/callout.d.ts.map +1 -1
  61. package/dist/cjs/components/callout.js +1 -1
  62. package/dist/cjs/components/callout.js.map +3 -3
  63. package/dist/cjs/components/callout.props.d.ts +9 -1
  64. package/dist/cjs/components/callout.props.d.ts.map +1 -1
  65. package/dist/cjs/components/callout.props.js +1 -1
  66. package/dist/cjs/components/callout.props.js.map +3 -3
  67. package/dist/cjs/components/card.d.ts.map +1 -1
  68. package/dist/cjs/components/card.js +1 -1
  69. package/dist/cjs/components/card.js.map +3 -3
  70. package/dist/cjs/components/card.props.d.ts +5 -0
  71. package/dist/cjs/components/card.props.d.ts.map +1 -1
  72. package/dist/cjs/components/card.props.js +1 -1
  73. package/dist/cjs/components/card.props.js.map +3 -3
  74. package/dist/cjs/components/checkbox-cards.d.ts.map +1 -1
  75. package/dist/cjs/components/checkbox-cards.js +1 -1
  76. package/dist/cjs/components/checkbox-cards.js.map +3 -3
  77. package/dist/cjs/components/checkbox-cards.props.d.ts +2 -2
  78. package/dist/cjs/components/checkbox-cards.props.js +1 -1
  79. package/dist/cjs/components/checkbox-cards.props.js.map +2 -2
  80. package/dist/cjs/components/checkbox-group.props.d.ts +6 -1
  81. package/dist/cjs/components/checkbox-group.props.d.ts.map +1 -1
  82. package/dist/cjs/components/checkbox.d.ts.map +1 -1
  83. package/dist/cjs/components/checkbox.js +1 -1
  84. package/dist/cjs/components/checkbox.js.map +3 -3
  85. package/dist/cjs/components/code.js.map +1 -1
  86. package/dist/cjs/components/code.props.d.ts +1 -1
  87. package/dist/cjs/components/context-menu.d.ts +1 -1
  88. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  89. package/dist/cjs/components/context-menu.js +1 -1
  90. package/dist/cjs/components/context-menu.js.map +3 -3
  91. package/dist/cjs/components/dialog.d.ts.map +1 -1
  92. package/dist/cjs/components/dialog.js +1 -1
  93. package/dist/cjs/components/dialog.js.map +3 -3
  94. package/dist/cjs/components/dialog.props.d.ts +5 -0
  95. package/dist/cjs/components/dialog.props.d.ts.map +1 -1
  96. package/dist/cjs/components/dialog.props.js +1 -1
  97. package/dist/cjs/components/dialog.props.js.map +3 -3
  98. package/dist/cjs/components/dropdown-menu.d.ts +1 -1
  99. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  100. package/dist/cjs/components/dropdown-menu.js +1 -1
  101. package/dist/cjs/components/dropdown-menu.js.map +3 -3
  102. package/dist/cjs/components/heading.props.d.ts +1 -1
  103. package/dist/cjs/components/icon-button.d.ts +79 -1
  104. package/dist/cjs/components/icon-button.d.ts.map +1 -1
  105. package/dist/cjs/components/icon-button.js +4 -1
  106. package/dist/cjs/components/icon-button.js.map +3 -3
  107. package/dist/cjs/components/image.d.ts +131 -12
  108. package/dist/cjs/components/image.d.ts.map +1 -1
  109. package/dist/cjs/components/image.js +1 -1
  110. package/dist/cjs/components/image.js.map +3 -3
  111. package/dist/cjs/components/image.props.d.ts +136 -21
  112. package/dist/cjs/components/image.props.d.ts.map +1 -1
  113. package/dist/cjs/components/image.props.js +1 -1
  114. package/dist/cjs/components/image.props.js.map +3 -3
  115. package/dist/cjs/components/link.props.d.ts +1 -1
  116. package/dist/cjs/components/progress.props.d.ts +2 -2
  117. package/dist/cjs/components/progress.props.js +1 -1
  118. package/dist/cjs/components/progress.props.js.map +2 -2
  119. package/dist/cjs/components/radio-cards.d.ts.map +1 -1
  120. package/dist/cjs/components/radio-cards.js +1 -1
  121. package/dist/cjs/components/radio-cards.js.map +3 -3
  122. package/dist/cjs/components/radio-cards.props.d.ts +2 -2
  123. package/dist/cjs/components/radio-cards.props.js +1 -1
  124. package/dist/cjs/components/radio-cards.props.js.map +2 -2
  125. package/dist/cjs/components/radio.d.ts.map +1 -1
  126. package/dist/cjs/components/radio.js +1 -1
  127. package/dist/cjs/components/radio.js.map +3 -3
  128. package/dist/cjs/components/segmented-control.props.d.ts +3 -3
  129. package/dist/cjs/components/segmented-control.props.js +1 -1
  130. package/dist/cjs/components/segmented-control.props.js.map +2 -2
  131. package/dist/cjs/components/select.d.ts.map +1 -1
  132. package/dist/cjs/components/select.js +1 -1
  133. package/dist/cjs/components/select.js.map +3 -3
  134. package/dist/cjs/components/select.props.d.ts +12 -0
  135. package/dist/cjs/components/select.props.d.ts.map +1 -1
  136. package/dist/cjs/components/select.props.js +1 -1
  137. package/dist/cjs/components/select.props.js.map +2 -2
  138. package/dist/cjs/components/sidebar.d.ts +5 -0
  139. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  140. package/dist/cjs/components/sidebar.js +1 -1
  141. package/dist/cjs/components/sidebar.js.map +3 -3
  142. package/dist/cjs/components/slider.d.ts +5 -0
  143. package/dist/cjs/components/slider.d.ts.map +1 -1
  144. package/dist/cjs/components/slider.js +1 -1
  145. package/dist/cjs/components/slider.js.map +3 -3
  146. package/dist/cjs/components/slider.props.d.ts +10 -2
  147. package/dist/cjs/components/slider.props.d.ts.map +1 -1
  148. package/dist/cjs/components/slider.props.js +1 -1
  149. package/dist/cjs/components/slider.props.js.map +2 -2
  150. package/dist/cjs/components/switch.d.ts.map +1 -1
  151. package/dist/cjs/components/switch.js +1 -1
  152. package/dist/cjs/components/switch.js.map +3 -3
  153. package/dist/cjs/components/switch.props.d.ts +17 -4
  154. package/dist/cjs/components/switch.props.d.ts.map +1 -1
  155. package/dist/cjs/components/switch.props.js +1 -1
  156. package/dist/cjs/components/switch.props.js.map +3 -3
  157. package/dist/cjs/components/tab-nav.d.ts.map +1 -1
  158. package/dist/cjs/components/tab-nav.js +1 -1
  159. package/dist/cjs/components/tab-nav.js.map +3 -3
  160. package/dist/cjs/components/tabs.d.ts.map +1 -1
  161. package/dist/cjs/components/tabs.js +1 -1
  162. package/dist/cjs/components/tabs.js.map +2 -2
  163. package/dist/cjs/components/text-area.d.ts.map +1 -1
  164. package/dist/cjs/components/text-area.js +1 -1
  165. package/dist/cjs/components/text-area.js.map +3 -3
  166. package/dist/cjs/components/text-area.props.d.ts +29 -0
  167. package/dist/cjs/components/text-area.props.d.ts.map +1 -1
  168. package/dist/cjs/components/text-area.props.js +1 -1
  169. package/dist/cjs/components/text-area.props.js.map +3 -3
  170. package/dist/cjs/components/text-field.d.ts.map +1 -1
  171. package/dist/cjs/components/text-field.js +4 -4
  172. package/dist/cjs/components/text-field.js.map +3 -3
  173. package/dist/cjs/components/text-field.props.d.ts +29 -0
  174. package/dist/cjs/components/text-field.props.d.ts.map +1 -1
  175. package/dist/cjs/components/text-field.props.js +1 -1
  176. package/dist/cjs/components/text-field.props.js.map +3 -3
  177. package/dist/cjs/components/text.props.d.ts +1 -1
  178. package/dist/cjs/components/theme.d.ts +3 -0
  179. package/dist/cjs/components/theme.d.ts.map +1 -1
  180. package/dist/cjs/components/theme.js +1 -1
  181. package/dist/cjs/components/theme.js.map +3 -3
  182. package/dist/cjs/components/theme.props.d.ts +14 -0
  183. package/dist/cjs/components/theme.props.d.ts.map +1 -1
  184. package/dist/cjs/components/theme.props.js +1 -1
  185. package/dist/cjs/components/theme.props.js.map +3 -3
  186. package/dist/cjs/components/toggle-button.d.ts +52 -0
  187. package/dist/cjs/components/toggle-button.d.ts.map +1 -1
  188. package/dist/cjs/components/toggle-button.js +1 -1
  189. package/dist/cjs/components/toggle-button.js.map +3 -3
  190. package/dist/cjs/components/toggle-icon-button.d.ts +84 -2
  191. package/dist/cjs/components/toggle-icon-button.d.ts.map +1 -1
  192. package/dist/cjs/components/toggle-icon-button.js +1 -1
  193. package/dist/cjs/components/toggle-icon-button.js.map +3 -3
  194. package/dist/cjs/hooks/index.d.ts +2 -0
  195. package/dist/cjs/hooks/index.d.ts.map +1 -0
  196. package/dist/cjs/hooks/index.js +2 -0
  197. package/dist/cjs/hooks/index.js.map +7 -0
  198. package/dist/cjs/hooks/use-live-announcer.d.ts +6 -0
  199. package/dist/cjs/hooks/use-live-announcer.d.ts.map +1 -0
  200. package/dist/cjs/hooks/use-live-announcer.js +10 -0
  201. package/dist/cjs/hooks/use-live-announcer.js.map +7 -0
  202. package/dist/cjs/index.d.ts +1 -0
  203. package/dist/cjs/index.d.ts.map +1 -1
  204. package/dist/cjs/index.js +1 -1
  205. package/dist/cjs/index.js.map +2 -2
  206. package/dist/cjs/props/weight.prop.d.ts +1 -1
  207. package/dist/cjs/props/weight.prop.js +1 -1
  208. package/dist/cjs/props/weight.prop.js.map +2 -2
  209. package/dist/esm/components/_internal/base-button.d.ts +36 -0
  210. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  211. package/dist/esm/components/_internal/base-button.js +1 -1
  212. package/dist/esm/components/_internal/base-button.js.map +3 -3
  213. package/dist/esm/components/_internal/base-button.props.d.ts +61 -0
  214. package/dist/esm/components/_internal/base-button.props.d.ts.map +1 -1
  215. package/dist/esm/components/_internal/base-button.props.js +1 -1
  216. package/dist/esm/components/_internal/base-button.props.js.map +3 -3
  217. package/dist/esm/components/_internal/base-checkbox.props.d.ts +6 -1
  218. package/dist/esm/components/_internal/base-checkbox.props.d.ts.map +1 -1
  219. package/dist/esm/components/_internal/base-checkbox.props.js +1 -1
  220. package/dist/esm/components/_internal/base-checkbox.props.js.map +3 -3
  221. package/dist/esm/components/_internal/base-menu.props.d.ts +8 -0
  222. package/dist/esm/components/_internal/base-menu.props.d.ts.map +1 -1
  223. package/dist/esm/components/_internal/base-menu.props.js +1 -1
  224. package/dist/esm/components/_internal/base-menu.props.js.map +3 -3
  225. package/dist/esm/components/_internal/base-radio.props.d.ts +6 -1
  226. package/dist/esm/components/_internal/base-radio.props.d.ts.map +1 -1
  227. package/dist/esm/components/_internal/base-radio.props.js +1 -1
  228. package/dist/esm/components/_internal/base-radio.props.js.map +3 -3
  229. package/dist/esm/components/accordion.d.ts.map +1 -1
  230. package/dist/esm/components/accordion.js +1 -1
  231. package/dist/esm/components/accordion.js.map +3 -3
  232. package/dist/esm/components/accordion.props.d.ts +9 -0
  233. package/dist/esm/components/accordion.props.d.ts.map +1 -1
  234. package/dist/esm/components/accordion.props.js +1 -1
  235. package/dist/esm/components/accordion.props.js.map +2 -2
  236. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  237. package/dist/esm/components/alert-dialog.js +1 -1
  238. package/dist/esm/components/alert-dialog.js.map +3 -3
  239. package/dist/esm/components/alert-dialog.props.d.ts +69 -2
  240. package/dist/esm/components/alert-dialog.props.d.ts.map +1 -1
  241. package/dist/esm/components/alert-dialog.props.js +1 -1
  242. package/dist/esm/components/alert-dialog.props.js.map +3 -3
  243. package/dist/esm/components/avatar.d.ts.map +1 -1
  244. package/dist/esm/components/avatar.js +1 -1
  245. package/dist/esm/components/avatar.js.map +3 -3
  246. package/dist/esm/components/avatar.props.d.ts +9 -1
  247. package/dist/esm/components/avatar.props.d.ts.map +1 -1
  248. package/dist/esm/components/avatar.props.js +1 -1
  249. package/dist/esm/components/avatar.props.js.map +3 -3
  250. package/dist/esm/components/badge.d.ts +8 -1
  251. package/dist/esm/components/badge.d.ts.map +1 -1
  252. package/dist/esm/components/badge.js +1 -1
  253. package/dist/esm/components/badge.js.map +3 -3
  254. package/dist/esm/components/badge.props.d.ts +14 -6
  255. package/dist/esm/components/badge.props.d.ts.map +1 -1
  256. package/dist/esm/components/badge.props.js +1 -1
  257. package/dist/esm/components/badge.props.js.map +3 -3
  258. package/dist/esm/components/blockquote.props.d.ts +1 -1
  259. package/dist/esm/components/button.d.ts +53 -1
  260. package/dist/esm/components/button.d.ts.map +1 -1
  261. package/dist/esm/components/button.js +1 -1
  262. package/dist/esm/components/button.js.map +3 -3
  263. package/dist/esm/components/button.props.d.ts +17 -0
  264. package/dist/esm/components/button.props.d.ts.map +1 -1
  265. package/dist/esm/components/button.props.js.map +2 -2
  266. package/dist/esm/components/callout.d.ts +4 -0
  267. package/dist/esm/components/callout.d.ts.map +1 -1
  268. package/dist/esm/components/callout.js +1 -1
  269. package/dist/esm/components/callout.js.map +3 -3
  270. package/dist/esm/components/callout.props.d.ts +9 -1
  271. package/dist/esm/components/callout.props.d.ts.map +1 -1
  272. package/dist/esm/components/callout.props.js +1 -1
  273. package/dist/esm/components/callout.props.js.map +3 -3
  274. package/dist/esm/components/card.d.ts.map +1 -1
  275. package/dist/esm/components/card.js +1 -1
  276. package/dist/esm/components/card.js.map +3 -3
  277. package/dist/esm/components/card.props.d.ts +5 -0
  278. package/dist/esm/components/card.props.d.ts.map +1 -1
  279. package/dist/esm/components/card.props.js +1 -1
  280. package/dist/esm/components/card.props.js.map +3 -3
  281. package/dist/esm/components/checkbox-cards.d.ts.map +1 -1
  282. package/dist/esm/components/checkbox-cards.js +1 -1
  283. package/dist/esm/components/checkbox-cards.js.map +3 -3
  284. package/dist/esm/components/checkbox-cards.props.d.ts +2 -2
  285. package/dist/esm/components/checkbox-cards.props.js +1 -1
  286. package/dist/esm/components/checkbox-cards.props.js.map +2 -2
  287. package/dist/esm/components/checkbox-group.props.d.ts +6 -1
  288. package/dist/esm/components/checkbox-group.props.d.ts.map +1 -1
  289. package/dist/esm/components/checkbox.d.ts.map +1 -1
  290. package/dist/esm/components/checkbox.js +1 -1
  291. package/dist/esm/components/checkbox.js.map +3 -3
  292. package/dist/esm/components/code.js.map +1 -1
  293. package/dist/esm/components/code.props.d.ts +1 -1
  294. package/dist/esm/components/context-menu.d.ts +1 -1
  295. package/dist/esm/components/context-menu.d.ts.map +1 -1
  296. package/dist/esm/components/context-menu.js +1 -1
  297. package/dist/esm/components/context-menu.js.map +3 -3
  298. package/dist/esm/components/dialog.d.ts.map +1 -1
  299. package/dist/esm/components/dialog.js +1 -1
  300. package/dist/esm/components/dialog.js.map +3 -3
  301. package/dist/esm/components/dialog.props.d.ts +5 -0
  302. package/dist/esm/components/dialog.props.d.ts.map +1 -1
  303. package/dist/esm/components/dialog.props.js +1 -1
  304. package/dist/esm/components/dialog.props.js.map +3 -3
  305. package/dist/esm/components/dropdown-menu.d.ts +1 -1
  306. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  307. package/dist/esm/components/dropdown-menu.js +1 -1
  308. package/dist/esm/components/dropdown-menu.js.map +3 -3
  309. package/dist/esm/components/heading.props.d.ts +1 -1
  310. package/dist/esm/components/icon-button.d.ts +79 -1
  311. package/dist/esm/components/icon-button.d.ts.map +1 -1
  312. package/dist/esm/components/icon-button.js +4 -1
  313. package/dist/esm/components/icon-button.js.map +3 -3
  314. package/dist/esm/components/image.d.ts +131 -12
  315. package/dist/esm/components/image.d.ts.map +1 -1
  316. package/dist/esm/components/image.js +1 -1
  317. package/dist/esm/components/image.js.map +3 -3
  318. package/dist/esm/components/image.props.d.ts +136 -21
  319. package/dist/esm/components/image.props.d.ts.map +1 -1
  320. package/dist/esm/components/image.props.js +1 -1
  321. package/dist/esm/components/image.props.js.map +3 -3
  322. package/dist/esm/components/link.props.d.ts +1 -1
  323. package/dist/esm/components/progress.props.d.ts +2 -2
  324. package/dist/esm/components/progress.props.js +1 -1
  325. package/dist/esm/components/progress.props.js.map +2 -2
  326. package/dist/esm/components/radio-cards.d.ts.map +1 -1
  327. package/dist/esm/components/radio-cards.js +1 -1
  328. package/dist/esm/components/radio-cards.js.map +3 -3
  329. package/dist/esm/components/radio-cards.props.d.ts +2 -2
  330. package/dist/esm/components/radio-cards.props.js +1 -1
  331. package/dist/esm/components/radio-cards.props.js.map +2 -2
  332. package/dist/esm/components/radio.d.ts.map +1 -1
  333. package/dist/esm/components/radio.js +1 -1
  334. package/dist/esm/components/radio.js.map +3 -3
  335. package/dist/esm/components/segmented-control.props.d.ts +3 -3
  336. package/dist/esm/components/segmented-control.props.js +1 -1
  337. package/dist/esm/components/segmented-control.props.js.map +2 -2
  338. package/dist/esm/components/select.d.ts.map +1 -1
  339. package/dist/esm/components/select.js +1 -1
  340. package/dist/esm/components/select.js.map +3 -3
  341. package/dist/esm/components/select.props.d.ts +12 -0
  342. package/dist/esm/components/select.props.d.ts.map +1 -1
  343. package/dist/esm/components/select.props.js +1 -1
  344. package/dist/esm/components/select.props.js.map +2 -2
  345. package/dist/esm/components/sidebar.d.ts +5 -0
  346. package/dist/esm/components/sidebar.d.ts.map +1 -1
  347. package/dist/esm/components/sidebar.js +1 -1
  348. package/dist/esm/components/sidebar.js.map +3 -3
  349. package/dist/esm/components/slider.d.ts +5 -0
  350. package/dist/esm/components/slider.d.ts.map +1 -1
  351. package/dist/esm/components/slider.js +1 -1
  352. package/dist/esm/components/slider.js.map +3 -3
  353. package/dist/esm/components/slider.props.d.ts +10 -2
  354. package/dist/esm/components/slider.props.d.ts.map +1 -1
  355. package/dist/esm/components/slider.props.js +1 -1
  356. package/dist/esm/components/slider.props.js.map +2 -2
  357. package/dist/esm/components/switch.d.ts.map +1 -1
  358. package/dist/esm/components/switch.js +1 -1
  359. package/dist/esm/components/switch.js.map +3 -3
  360. package/dist/esm/components/switch.props.d.ts +17 -4
  361. package/dist/esm/components/switch.props.d.ts.map +1 -1
  362. package/dist/esm/components/switch.props.js +1 -1
  363. package/dist/esm/components/switch.props.js.map +3 -3
  364. package/dist/esm/components/tab-nav.d.ts.map +1 -1
  365. package/dist/esm/components/tab-nav.js +1 -1
  366. package/dist/esm/components/tab-nav.js.map +3 -3
  367. package/dist/esm/components/tabs.d.ts.map +1 -1
  368. package/dist/esm/components/tabs.js +1 -1
  369. package/dist/esm/components/tabs.js.map +2 -2
  370. package/dist/esm/components/text-area.d.ts.map +1 -1
  371. package/dist/esm/components/text-area.js +1 -1
  372. package/dist/esm/components/text-area.js.map +3 -3
  373. package/dist/esm/components/text-area.props.d.ts +29 -0
  374. package/dist/esm/components/text-area.props.d.ts.map +1 -1
  375. package/dist/esm/components/text-area.props.js +1 -1
  376. package/dist/esm/components/text-area.props.js.map +3 -3
  377. package/dist/esm/components/text-field.d.ts.map +1 -1
  378. package/dist/esm/components/text-field.js +4 -4
  379. package/dist/esm/components/text-field.js.map +3 -3
  380. package/dist/esm/components/text-field.props.d.ts +29 -0
  381. package/dist/esm/components/text-field.props.d.ts.map +1 -1
  382. package/dist/esm/components/text-field.props.js +1 -1
  383. package/dist/esm/components/text-field.props.js.map +3 -3
  384. package/dist/esm/components/text.props.d.ts +1 -1
  385. package/dist/esm/components/theme.d.ts +3 -0
  386. package/dist/esm/components/theme.d.ts.map +1 -1
  387. package/dist/esm/components/theme.js +1 -1
  388. package/dist/esm/components/theme.js.map +3 -3
  389. package/dist/esm/components/theme.props.d.ts +14 -0
  390. package/dist/esm/components/theme.props.d.ts.map +1 -1
  391. package/dist/esm/components/theme.props.js +1 -1
  392. package/dist/esm/components/theme.props.js.map +3 -3
  393. package/dist/esm/components/toggle-button.d.ts +52 -0
  394. package/dist/esm/components/toggle-button.d.ts.map +1 -1
  395. package/dist/esm/components/toggle-button.js +1 -1
  396. package/dist/esm/components/toggle-button.js.map +3 -3
  397. package/dist/esm/components/toggle-icon-button.d.ts +84 -2
  398. package/dist/esm/components/toggle-icon-button.d.ts.map +1 -1
  399. package/dist/esm/components/toggle-icon-button.js +1 -1
  400. package/dist/esm/components/toggle-icon-button.js.map +3 -3
  401. package/dist/esm/hooks/index.d.ts +2 -0
  402. package/dist/esm/hooks/index.d.ts.map +1 -0
  403. package/dist/esm/hooks/index.js +2 -0
  404. package/dist/esm/hooks/index.js.map +7 -0
  405. package/dist/esm/hooks/use-live-announcer.d.ts +6 -0
  406. package/dist/esm/hooks/use-live-announcer.d.ts.map +1 -0
  407. package/dist/esm/hooks/use-live-announcer.js +10 -0
  408. package/dist/esm/hooks/use-live-announcer.js.map +7 -0
  409. package/dist/esm/index.d.ts +1 -0
  410. package/dist/esm/index.d.ts.map +1 -1
  411. package/dist/esm/index.js +1 -1
  412. package/dist/esm/index.js.map +2 -2
  413. package/dist/esm/props/weight.prop.d.ts +1 -1
  414. package/dist/esm/props/weight.prop.js +1 -1
  415. package/dist/esm/props/weight.prop.js.map +2 -2
  416. package/layout/components.css +1 -0
  417. package/layout.css +1 -0
  418. package/package.json +2 -1
  419. package/src/components/_internal/base-button.css +483 -284
  420. package/src/components/_internal/base-button.props.ts +87 -0
  421. package/src/components/_internal/base-button.tsx +127 -10
  422. package/src/components/_internal/base-card.css +866 -83
  423. package/src/components/_internal/base-checkbox.css +252 -52
  424. package/src/components/_internal/base-checkbox.props.ts +4 -1
  425. package/src/components/_internal/base-dialog.css +39 -8
  426. package/src/components/_internal/base-menu.css +55 -32
  427. package/src/components/_internal/base-menu.props.ts +10 -0
  428. package/src/components/_internal/base-radio.css +222 -52
  429. package/src/components/_internal/base-radio.props.ts +4 -1
  430. package/src/components/_internal/base-tab-list.css +16 -0
  431. package/src/components/accordion.css +465 -62
  432. package/src/components/accordion.props.tsx +6 -0
  433. package/src/components/accordion.tsx +54 -7
  434. package/src/components/alert-dialog.props.tsx +22 -2
  435. package/src/components/alert-dialog.tsx +94 -3
  436. package/src/components/avatar.css +294 -152
  437. package/src/components/avatar.props.tsx +7 -1
  438. package/src/components/avatar.tsx +12 -2
  439. package/src/components/badge.css +160 -138
  440. package/src/components/badge.props.tsx +10 -3
  441. package/src/components/badge.tsx +71 -9
  442. package/src/components/button.css +88 -0
  443. package/src/components/button.props.tsx +17 -0
  444. package/src/components/button.tsx +107 -5
  445. package/src/components/callout.css +122 -35
  446. package/src/components/callout.props.tsx +7 -1
  447. package/src/components/callout.tsx +32 -9
  448. package/src/components/card.css +0 -597
  449. package/src/components/card.props.tsx +3 -0
  450. package/src/components/card.tsx +4 -2
  451. package/src/components/checkbox-cards.css +27 -104
  452. package/src/components/checkbox-cards.props.tsx +2 -2
  453. package/src/components/checkbox-cards.tsx +21 -3
  454. package/src/components/checkbox.tsx +2 -0
  455. package/src/components/code.css +1 -1
  456. package/src/components/code.tsx +1 -1
  457. package/src/components/container.css +1 -0
  458. package/src/components/context-menu.tsx +54 -12
  459. package/src/components/dialog.props.tsx +3 -0
  460. package/src/components/dialog.tsx +93 -3
  461. package/src/components/dropdown-menu.tsx +49 -12
  462. package/src/components/icon-button.css +73 -4
  463. package/src/components/icon-button.tsx +125 -19
  464. package/src/components/image.css +160 -91
  465. package/src/components/image.props.ts +152 -15
  466. package/src/components/image.tsx +290 -247
  467. package/src/components/kbd.css +23 -44
  468. package/src/components/progress.css +130 -149
  469. package/src/components/progress.props.tsx +2 -2
  470. package/src/components/radio-cards.css +23 -113
  471. package/src/components/radio-cards.props.tsx +2 -2
  472. package/src/components/radio-cards.tsx +45 -18
  473. package/src/components/radio.tsx +4 -3
  474. package/src/components/scroll-area.css +1 -1
  475. package/src/components/segmented-control.css +83 -64
  476. package/src/components/segmented-control.props.tsx +3 -3
  477. package/src/components/select.css +502 -224
  478. package/src/components/select.props.tsx +8 -0
  479. package/src/components/select.tsx +45 -2
  480. package/src/components/sidebar.css +17 -6
  481. package/src/components/sidebar.tsx +61 -5
  482. package/src/components/slider.css +228 -88
  483. package/src/components/slider.props.tsx +6 -2
  484. package/src/components/slider.tsx +201 -24
  485. package/src/components/spinner.css +12 -0
  486. package/src/components/switch.css +135 -216
  487. package/src/components/switch.props.tsx +16 -4
  488. package/src/components/switch.tsx +5 -3
  489. package/src/components/tab-nav.tsx +6 -3
  490. package/src/components/tabs.tsx +2 -0
  491. package/src/components/text-area.css +222 -140
  492. package/src/components/text-area.props.tsx +18 -1
  493. package/src/components/text-area.tsx +58 -7
  494. package/src/components/text-field.css +214 -131
  495. package/src/components/text-field.props.tsx +17 -0
  496. package/src/components/text-field.tsx +79 -28
  497. package/src/components/theme.props.tsx +12 -0
  498. package/src/components/theme.tsx +31 -1
  499. package/src/components/toggle-button.tsx +102 -3
  500. package/src/components/toggle-icon-button.tsx +150 -7
  501. package/src/components/tooltip.css +3 -3
  502. package/src/hooks/index.ts +1 -0
  503. package/src/hooks/use-live-announcer.ts +52 -0
  504. package/src/index.ts +1 -0
  505. package/src/props/weight.prop.ts +1 -1
  506. package/src/styles/fonts.css +27 -13
  507. package/src/styles/index.css +1 -1
  508. package/src/styles/tokens/base.css +2 -0
  509. package/src/styles/tokens/blur.css +32 -0
  510. package/src/styles/tokens/color.css +9 -9
  511. package/src/styles/tokens/constants.css +88 -140
  512. package/src/styles/tokens/index.css +2 -0
  513. package/src/styles/tokens/opacity.css +32 -0
  514. package/src/styles/tokens/radius.css +6 -10
  515. package/src/styles/tokens/shadow.css +25 -25
  516. package/src/styles/tokens/transition.css +49 -13
  517. package/src/styles/tokens/typography.css +7 -3
  518. package/src/styles/utilities/font-weight.css +16 -0
  519. package/styles.css +10689 -8708
  520. package/tokens/base.css +127 -49
  521. package/tokens.css +158 -114
  522. package/utilities.css +72 -0
@@ -40,47 +40,98 @@ interface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextField
40
40
  const TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>(
41
41
  (props, forwardedRef) => {
42
42
  const inputRef = React.useRef<HTMLInputElement>(null);
43
- const { children, className, color, radius, panelBackground, style, ...inputProps } =
43
+ const { children, className, color, radius, panelBackground, material, style, ...inputProps } =
44
44
  extractProps(props, textFieldRootPropDefs, marginPropDefs);
45
+ const effectiveMaterial = material || panelBackground;
46
+
47
+ // Generate unique IDs for accessibility
48
+ const errorId = React.useId();
49
+
50
+ // Determine invalid state
51
+ const isInvalid = inputProps.error || inputProps.isInvalid;
52
+
53
+ const { 'aria-describedby': ariaDescribedby, 'aria-labelledby': ariaLabelledby } = inputProps;
54
+
55
+ // Build aria-describedby string
56
+ const describedBy = React.useMemo(() => {
57
+ const parts = [];
58
+ if (inputProps.errorMessage) parts.push(errorId);
59
+ if (ariaDescribedby) parts.push(ariaDescribedby);
60
+ return parts.length > 0 ? parts.join(' ') : undefined;
61
+ }, [inputProps.errorMessage, ariaDescribedby, errorId]);
62
+
63
+ // Build aria attributes
64
+ const ariaProps = React.useMemo(
65
+ () => ({
66
+ 'aria-invalid': isInvalid,
67
+ 'aria-describedby': describedBy,
68
+ 'aria-labelledby': ariaLabelledby,
69
+ }),
70
+ [isInvalid, describedBy, ariaLabelledby],
71
+ );
72
+
73
+ // Filter out our custom props to avoid DOM warnings
74
+ const {
75
+ error,
76
+ errorMessage,
77
+ isInvalid: _isInvalid,
78
+ required,
79
+ 'aria-describedby': _ariaDescribedby,
80
+ 'aria-labelledby': _ariaLabelledby,
81
+ ...nativeInputProps
82
+ } = inputProps;
83
+
84
+ // Memoized pointer event handler
85
+ const handlePointerDown = React.useCallback((event: React.PointerEvent) => {
86
+ const target = event.target as HTMLElement;
87
+ if (target.closest('input, button, a')) return;
88
+
89
+ const input = inputRef.current;
90
+ if (!input) return;
91
+
92
+ // Same selector as in the CSS to find the right slot
93
+ const isRightSlot = target.closest(`
94
+ .rt-TextFieldSlot[data-side='right'],
95
+ .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])
96
+ `);
97
+
98
+ const cursorPosition = isRightSlot ? input.value.length : 0;
99
+
100
+ requestAnimationFrame(() => {
101
+ // Only some input types support this, browsers will throw an error if not supported
102
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.
103
+ try {
104
+ input.setSelectionRange(cursorPosition, cursorPosition);
105
+ } catch {}
106
+ input.focus();
107
+ });
108
+ }, []);
109
+
45
110
  return (
46
111
  <div
47
112
  data-accent-color={color}
48
113
  data-radius={radius}
49
- data-panel-background={panelBackground}
114
+ data-panel-background={effectiveMaterial}
115
+ data-material={effectiveMaterial}
50
116
  style={style}
51
- className={classNames('rt-TextFieldRoot', className)}
52
- onPointerDown={(event) => {
53
- const target = event.target as HTMLElement;
54
- if (target.closest('input, button, a')) return;
55
-
56
- const input = inputRef.current;
57
- if (!input) return;
58
-
59
- // Same selector as in the CSS to find the right slot
60
- const isRightSlot = target.closest(`
61
- .rt-TextFieldSlot[data-side='right'],
62
- .rt-TextFieldSlot:not([data-side='right']) ~ .rt-TextFieldSlot:not([data-side='left'])
63
- `);
64
-
65
- const cursorPosition = isRightSlot ? input.value.length : 0;
66
-
67
- requestAnimationFrame(() => {
68
- // Only some input types support this, browsers will throw an error if not supported
69
- // See: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#:~:text=Note%20that%20according,not%20support%20selection%22.
70
- try {
71
- input.setSelectionRange(cursorPosition, cursorPosition);
72
- } catch {}
73
- input.focus();
74
- });
75
- }}
117
+ className={classNames('rt-TextFieldRoot', className, {
118
+ 'rt-error': isInvalid,
119
+ })}
120
+ onPointerDown={handlePointerDown}
76
121
  >
77
122
  <input
78
123
  spellCheck="false"
79
- {...inputProps}
124
+ {...nativeInputProps}
125
+ {...ariaProps}
80
126
  ref={composeRefs(inputRef, forwardedRef)}
81
127
  className="rt-reset rt-TextFieldInput"
82
128
  />
83
129
  {children}
130
+ {inputProps.errorMessage && (
131
+ <div id={errorId} className="rt-TextFieldErrorMessage" role="alert" aria-live="polite">
132
+ {inputProps.errorMessage}
133
+ </div>
134
+ )}
84
135
  </div>
85
136
  );
86
137
  },
@@ -6,6 +6,7 @@ import type { GetPropDefTypes, PropDef } from '../props/prop-def.js';
6
6
 
7
7
  const appearances = ['inherit', 'light', 'dark'] as const;
8
8
  const panelBackgrounds = ['solid', 'translucent'] as const;
9
+ const materials = ['solid', 'translucent'] as const;
9
10
  const scalings = ['90%', '95%', '100%', '105%', '110%'] as const;
10
11
 
11
12
  const themePropDefs = {
@@ -45,6 +46,16 @@ const themePropDefs = {
45
46
  * @link
46
47
  * https://www.radix-ui.com/themes/docs/theme/visual-style
47
48
  */
49
+ material: { type: 'enum', values: materials, default: 'translucent' },
50
+ /**
51
+ * Controls whether to use a solid or translucent background color on panelled
52
+ * elements such as Card or Table is solid or translucent.
53
+ *
54
+ * @deprecated Use `material` prop instead. This prop will be removed in a future version.
55
+ *
56
+ * @link
57
+ * https://www.radix-ui.com/themes/docs/theme/visual-style
58
+ */
48
59
  panelBackground: { type: 'enum', values: panelBackgrounds, default: 'translucent' },
49
60
  /**
50
61
  * Sets the default radius of the components.
@@ -65,6 +76,7 @@ const themePropDefs = {
65
76
  appearance: PropDef<(typeof appearances)[number]>;
66
77
  accentColor: PropDef<(typeof accentColors)[number]>;
67
78
  grayColor: PropDef<(typeof grayColors)[number]>;
79
+ material: PropDef<(typeof materials)[number]>;
68
80
  panelBackground: PropDef<(typeof panelBackgrounds)[number]>;
69
81
  radius: PropDef<(typeof radii)[number]>;
70
82
  scaling: PropDef<(typeof scalings)[number]>;
@@ -15,6 +15,7 @@ const noop = () => {};
15
15
  type ThemeAppearance = (typeof themePropDefs.appearance.values)[number];
16
16
  type ThemeAccentColor = (typeof themePropDefs.accentColor.values)[number];
17
17
  type ThemeGrayColor = (typeof themePropDefs.grayColor.values)[number];
18
+ type ThemeMaterial = (typeof themePropDefs.material.values)[number];
18
19
  type ThemePanelBackground = (typeof themePropDefs.panelBackground.values)[number];
19
20
  type ThemeRadius = (typeof themePropDefs.radius.values)[number];
20
21
  type ThemeScaling = (typeof themePropDefs.scaling.values)[number];
@@ -23,6 +24,7 @@ interface ThemeChangeHandlers {
23
24
  onAppearanceChange: (appearance: ThemeAppearance) => void;
24
25
  onAccentColorChange: (accentColor: ThemeAccentColor) => void;
25
26
  onGrayColorChange: (grayColor: ThemeGrayColor) => void;
27
+ onMaterialChange: (material: ThemeMaterial) => void;
26
28
  onPanelBackgroundChange: (panelBackground: ThemePanelBackground) => void;
27
29
  onRadiusChange: (radius: ThemeRadius) => void;
28
30
  onScalingChange: (scaling: ThemeScaling) => void;
@@ -33,6 +35,7 @@ interface ThemeContextValue extends ThemeChangeHandlers {
33
35
  accentColor: ThemeAccentColor;
34
36
  grayColor: ThemeGrayColor;
35
37
  resolvedGrayColor: ThemeGrayColor;
38
+ material: ThemeMaterial;
36
39
  panelBackground: ThemePanelBackground;
37
40
  radius: ThemeRadius;
38
41
  scaling: ThemeScaling;
@@ -70,12 +73,23 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
70
73
  appearance: appearanceProp = themePropDefs.appearance.default,
71
74
  accentColor: accentColorProp = themePropDefs.accentColor.default,
72
75
  grayColor: grayColorProp = themePropDefs.grayColor.default,
76
+ material: materialProp = themePropDefs.material.default,
73
77
  panelBackground: panelBackgroundProp = themePropDefs.panelBackground.default,
74
78
  radius: radiusProp = themePropDefs.radius.default,
75
79
  scaling: scalingProp = themePropDefs.scaling.default,
76
80
  hasBackground = themePropDefs.hasBackground.default,
77
81
  ...rootProps
78
82
  } = props;
83
+
84
+ // Show deprecation warning for panelBackground when used
85
+ React.useEffect(() => {
86
+ if (props.panelBackground !== undefined) {
87
+ console.warn(
88
+ 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',
89
+ );
90
+ }
91
+ }, [props.panelBackground]);
92
+
79
93
  const [appearance, setAppearance] = React.useState(appearanceProp);
80
94
  React.useEffect(() => setAppearance(appearanceProp), [appearanceProp]);
81
95
 
@@ -85,8 +99,15 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
85
99
  const [grayColor, setGrayColor] = React.useState(grayColorProp);
86
100
  React.useEffect(() => setGrayColor(grayColorProp), [grayColorProp]);
87
101
 
102
+ // Material takes precedence over panelBackground
103
+ const effectiveMaterial =
104
+ materialProp !== themePropDefs.material.default ? materialProp : panelBackgroundProp;
105
+ const [material, setMaterial] = React.useState(effectiveMaterial);
106
+ React.useEffect(() => setMaterial(effectiveMaterial), [effectiveMaterial]);
107
+
108
+ // Keep panelBackground in sync with material for backward compatibility
88
109
  const [panelBackground, setPanelBackground] = React.useState(panelBackgroundProp);
89
- React.useEffect(() => setPanelBackground(panelBackgroundProp), [panelBackgroundProp]);
110
+ React.useEffect(() => setPanelBackground(material), [material]);
90
111
 
91
112
  const [radius, setRadius] = React.useState(radiusProp);
92
113
  React.useEffect(() => setRadius(radiusProp), [radiusProp]);
@@ -104,6 +125,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
104
125
  appearance={appearance}
105
126
  accentColor={accentColor}
106
127
  grayColor={grayColor}
128
+ material={material}
107
129
  panelBackground={panelBackground}
108
130
  radius={radius}
109
131
  scaling={scaling}
@@ -111,6 +133,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
111
133
  onAppearanceChange={setAppearance}
112
134
  onAccentColorChange={setAccentColor}
113
135
  onGrayColorChange={setGrayColor}
136
+ onMaterialChange={setMaterial}
114
137
  onPanelBackgroundChange={setPanelBackground}
115
138
  onRadiusChange={setRadius}
116
139
  onScalingChange={setScaling}
@@ -138,6 +161,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
138
161
  appearance = props.appearance ?? context?.appearance ?? themePropDefs.appearance.default,
139
162
  accentColor = props.accentColor ?? context?.accentColor ?? themePropDefs.accentColor.default,
140
163
  grayColor = props.grayColor ?? context?.resolvedGrayColor ?? themePropDefs.grayColor.default,
164
+ material = props.material ?? context?.material ?? themePropDefs.material.default,
141
165
  panelBackground = props.panelBackground ??
142
166
  context?.panelBackground ??
143
167
  themePropDefs.panelBackground.default,
@@ -147,6 +171,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
147
171
  onAppearanceChange = noop,
148
172
  onAccentColorChange = noop,
149
173
  onGrayColorChange = noop,
174
+ onMaterialChange = noop,
150
175
  onPanelBackgroundChange = noop,
151
176
  onRadiusChange = noop,
152
177
  onScalingChange = noop,
@@ -166,6 +191,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
166
191
  accentColor,
167
192
  grayColor,
168
193
  resolvedGrayColor,
194
+ material,
169
195
  panelBackground,
170
196
  radius,
171
197
  scaling,
@@ -173,6 +199,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
173
199
  onAppearanceChange,
174
200
  onAccentColorChange,
175
201
  onGrayColorChange,
202
+ onMaterialChange,
176
203
  onPanelBackgroundChange,
177
204
  onRadiusChange,
178
205
  onScalingChange,
@@ -182,6 +209,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
182
209
  accentColor,
183
210
  grayColor,
184
211
  resolvedGrayColor,
212
+ material,
185
213
  panelBackground,
186
214
  radius,
187
215
  scaling,
@@ -189,6 +217,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
189
217
  onAppearanceChange,
190
218
  onAccentColorChange,
191
219
  onGrayColorChange,
220
+ onMaterialChange,
192
221
  onPanelBackgroundChange,
193
222
  onRadiusChange,
194
223
  onScalingChange,
@@ -201,6 +230,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
201
230
  data-gray-color={resolvedGrayColor}
202
231
  // for nested `Theme` background
203
232
  data-has-background={hasBackground ? 'true' : 'false'}
233
+ data-material={material}
204
234
  data-panel-background={panelBackground}
205
235
  data-radius={radius}
206
236
  data-scaling={scaling}
@@ -1,25 +1,124 @@
1
1
  import * as React from 'react';
2
2
  import { Toggle } from 'radix-ui';
3
3
  import { Button } from './button.js';
4
+ import { useLiveAnnouncer } from '../hooks/use-live-announcer.js';
4
5
 
6
+ /**
7
+ * ToggleButton props that extend Button with toggle-specific functionality
8
+ *
9
+ * The ToggleButton component provides a button that can be pressed/unpressed
10
+ * with proper accessibility announcements and state management.
11
+ */
5
12
  interface ToggleButtonProps extends React.ComponentPropsWithoutRef<typeof Button> {
13
+ /** Controlled pressed state */
6
14
  pressed?: boolean;
15
+ /** Callback when pressed state changes */
7
16
  onPressedChange?: (pressed: boolean) => void;
17
+ /** Default pressed state for uncontrolled usage */
8
18
  defaultPressed?: boolean;
9
19
  }
10
20
 
11
21
  type ToggleButtonElement = React.ElementRef<typeof Button>;
12
22
 
23
+ /**
24
+ * ToggleButton component for buttons that can be pressed/unpressed
25
+ *
26
+ * The ToggleButton component extends Button with toggle functionality using
27
+ * Radix UI's Toggle primitive. It provides proper accessibility announcements,
28
+ * controlled/uncontrolled state management, and seamless integration with
29
+ * the existing Button component.
30
+ *
31
+ * Key features:
32
+ * - Controlled and uncontrolled state management
33
+ * - Live accessibility announcements for screen readers
34
+ * - Automatic state validation and warnings
35
+ * - Seamless integration with Button props and styling
36
+ * - Proper ARIA attributes for toggle functionality
37
+ *
38
+ * @example
39
+ * ```tsx
40
+ * // Uncontrolled toggle button
41
+ * <ToggleButton defaultPressed={false}>
42
+ * Toggle Me
43
+ * </ToggleButton>
44
+ *
45
+ * // Controlled toggle button
46
+ * const [pressed, setPressed] = React.useState(false);
47
+ * <ToggleButton
48
+ * pressed={pressed}
49
+ * onPressedChange={setPressed}
50
+ * >
51
+ * {pressed ? 'On' : 'Off'}
52
+ * </ToggleButton>
53
+ *
54
+ * // Toggle button with all Button props
55
+ * <ToggleButton
56
+ * variant="solid"
57
+ * size="3"
58
+ * color="blue"
59
+ * pressed={isActive}
60
+ * onPressedChange={setIsActive}
61
+ * >
62
+ * {isActive ? 'Active' : 'Inactive'}
63
+ * </ToggleButton>
64
+ * ```
65
+ */
13
66
  const ToggleButton = React.forwardRef<ToggleButtonElement, ToggleButtonProps>(
14
- ({ pressed, onPressedChange, defaultPressed, ...buttonProps }, forwardedRef) => {
67
+ ({ pressed, onPressedChange, defaultPressed, children, ...buttonProps }, forwardedRef) => {
68
+ // Get the live announcer for accessibility announcements
69
+ const announce = useLiveAnnouncer();
70
+
71
+ /**
72
+ * Extract accessible name from button content for announcements
73
+ * This ensures screen readers announce meaningful state changes
74
+ */
75
+ const getAccessibleName = React.useCallback(() => {
76
+ if (typeof children === 'string') return children;
77
+ if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {
78
+ return (children.props as any).children;
79
+ }
80
+ return 'Toggle button';
81
+ }, [children]);
82
+
83
+ /**
84
+ * Memoized handler for state changes with accessibility announcements
85
+ * This ensures screen readers announce the new state immediately
86
+ */
87
+ const handlePressedChange = React.useCallback(
88
+ (newPressed: boolean) => {
89
+ const accessibleName = getAccessibleName();
90
+ // Announce the state change for screen readers
91
+ announce(`${accessibleName} ${newPressed ? 'pressed' : 'unpressed'}`);
92
+ // Call the user's change handler
93
+ onPressedChange?.(newPressed);
94
+ },
95
+ [announce, onPressedChange, getAccessibleName],
96
+ );
97
+
98
+ // Development-only warning for controlled/uncontrolled pattern
99
+ // This helps developers avoid common state management mistakes
100
+ React.useEffect(() => {
101
+ if (process.env.NODE_ENV === 'development' && pressed !== undefined && onPressedChange === undefined) {
102
+ console.warn(
103
+ 'ToggleButton: You provided a `pressed` prop without an `onPressedChange` handler. ' +
104
+ 'This will result in a read-only toggle button. If you want the button to be interactive, ' +
105
+ 'you should provide an `onPressedChange` handler.',
106
+ );
107
+ }
108
+ }, [pressed, onPressedChange]);
109
+
110
+ // Render the toggle button using Radix UI's Toggle primitive
111
+ // This provides proper ARIA attributes and keyboard navigation
15
112
  return (
16
113
  <Toggle.Root
17
114
  pressed={pressed}
18
- onPressedChange={onPressedChange}
115
+ onPressedChange={handlePressedChange}
19
116
  defaultPressed={defaultPressed}
20
117
  asChild
21
118
  >
22
- <Button {...buttonProps} ref={forwardedRef} />
119
+ <Button {...buttonProps} ref={forwardedRef}>
120
+ {children}
121
+ </Button>
23
122
  </Toggle.Root>
24
123
  );
25
124
  },
@@ -2,37 +2,180 @@ import * as React from 'react';
2
2
  import { Toggle } from 'radix-ui';
3
3
  import { IconButton } from './icon-button.js';
4
4
  import { BaseButton } from './_internal/base-button.js';
5
- import type { BaseButtonProps } from './_internal/base-button.js';
5
+ import { useLiveAnnouncer } from '../hooks/use-live-announcer.js';
6
+ import type { IconButtonProps } from './icon-button.js';
6
7
 
7
8
  type ToggleIconButtonElement = React.ElementRef<typeof BaseButton>;
8
9
 
9
- // Extract toggle-specific props from Radix Toggle
10
+ /**
11
+ * Extract toggle-specific props from Radix Toggle
12
+ * These props control the toggle state and behavior
13
+ */
10
14
  type ToggleProps = React.ComponentPropsWithoutRef<typeof Toggle.Root>;
11
15
 
12
- // Required accessibility props for icon buttons (same as IconButton)
16
+ /**
17
+ * Required accessibility props for icon buttons (same as IconButton)
18
+ * Icon buttons must have an accessible name to meet WCAG guidelines
19
+ *
20
+ * Three ways to provide accessibility:
21
+ * 1. aria-label: Direct descriptive text
22
+ * 2. aria-labelledby: Reference to a label element
23
+ * 3. children: Visible text content (fallback)
24
+ */
13
25
  type AccessibilityProps =
14
26
  | { 'aria-label': string; 'aria-labelledby'?: never }
15
27
  | { 'aria-label'?: never; 'aria-labelledby': string }
16
28
  | { 'aria-label'?: never; 'aria-labelledby'?: never; children: React.ReactNode };
17
29
 
18
- // Combine BaseButton props with Toggle-specific props and accessibility requirements
19
- interface ToggleIconButtonProps extends Omit<BaseButtonProps, 'as'> {
30
+ /**
31
+ * Combine IconButton props with Toggle-specific props
32
+ * Includes tooltip props from IconButton for comprehensive functionality
33
+ */
34
+ interface ToggleIconButtonProps extends Omit<IconButtonProps, 'as'> {
35
+ /** Controlled pressed state */
20
36
  pressed?: ToggleProps['pressed'];
37
+ /** Callback when pressed state changes */
21
38
  onPressedChange?: ToggleProps['onPressedChange'];
39
+ /** Default pressed state for uncontrolled usage */
22
40
  defaultPressed?: ToggleProps['defaultPressed'];
23
41
  }
24
42
 
25
- // Intersection with accessibility props
43
+ /**
44
+ * Intersection with accessibility props to ensure compliance
45
+ * This type ensures all ToggleIconButton instances have proper accessibility
46
+ */
26
47
  type ToggleIconButtonPropsWithAccessibility = ToggleIconButtonProps & AccessibilityProps;
27
48
 
49
+ /**
50
+ * ToggleIconButton component for icon buttons that can be pressed/unpressed
51
+ *
52
+ * The ToggleIconButton component extends IconButton with toggle functionality
53
+ * using Radix UI's Toggle primitive. It provides proper accessibility announcements,
54
+ * controlled/uncontrolled state management, and seamless integration with
55
+ * the existing IconButton component.
56
+ *
57
+ * Key features:
58
+ * - Controlled and uncontrolled state management
59
+ * - Live accessibility announcements for screen readers
60
+ * - Enforced accessibility requirements (aria-label, aria-labelledby, or children)
61
+ * - Automatic state validation and warnings
62
+ * - Seamless integration with IconButton props and styling
63
+ * - Proper ARIA attributes for toggle functionality
64
+ * - Built-in tooltip support from IconButton
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * // Uncontrolled toggle icon button
69
+ * <ToggleIconButton defaultPressed={false} aria-label="Toggle notifications">
70
+ * <Bell />
71
+ * </ToggleIconButton>
72
+ *
73
+ * // Controlled toggle icon button
74
+ * const [pressed, setPressed] = React.useState(false);
75
+ * <ToggleIconButton
76
+ * pressed={pressed}
77
+ * onPressedChange={setPressed}
78
+ * aria-label="Toggle notifications"
79
+ * >
80
+ * <Bell />
81
+ * </ToggleIconButton>
82
+ *
83
+ * // Toggle icon button with tooltip
84
+ * <ToggleIconButton
85
+ * variant="solid"
86
+ * size="3"
87
+ * color="blue"
88
+ * pressed={isActive}
89
+ * onPressedChange={setIsActive}
90
+ * aria-label="Toggle feature"
91
+ * tooltip="Toggle this feature on/off"
92
+ * >
93
+ * <Star />
94
+ * </ToggleIconButton>
95
+ *
96
+ * // Toggle icon button with aria-labelledby
97
+ * <ToggleIconButton
98
+ * aria-labelledby="notifications-label"
99
+ * pressed={notificationsEnabled}
100
+ * onPressedChange={setNotificationsEnabled}
101
+ * >
102
+ * <Bell />
103
+ * </ToggleIconButton>
104
+ * <span id="notifications-label">Toggle notifications</span>
105
+ * ```
106
+ */
28
107
  const ToggleIconButton = React.forwardRef<
29
108
  ToggleIconButtonElement,
30
109
  ToggleIconButtonPropsWithAccessibility
31
110
  >(({ pressed, onPressedChange, defaultPressed, ...iconButtonProps }, forwardedRef) => {
111
+ // Get the live announcer for accessibility announcements
112
+ const announce = useLiveAnnouncer();
113
+
114
+ /**
115
+ * Extract accessible name from various sources for announcements
116
+ * This ensures screen readers announce meaningful state changes
117
+ * Priority: aria-label > aria-labelledby > children > fallback
118
+ */
119
+ const getAccessibleName = React.useCallback(() => {
120
+ const {
121
+ 'aria-label': ariaLabel,
122
+ 'aria-labelledby': ariaLabelledBy,
123
+ children,
124
+ } = iconButtonProps;
125
+
126
+ // First priority: direct aria-label
127
+ if (ariaLabel) return ariaLabel;
128
+
129
+ // Second priority: referenced label element
130
+ if (ariaLabelledBy) {
131
+ const labelElement = document.getElementById(ariaLabelledBy);
132
+ return labelElement?.textContent || 'Toggle icon button';
133
+ }
134
+
135
+ // Third priority: visible text children
136
+ if (typeof children === 'string') return children;
137
+ if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {
138
+ return (children.props as any).children;
139
+ }
140
+
141
+ // Fallback for edge cases
142
+ return 'Toggle icon button';
143
+ }, [iconButtonProps]);
144
+
145
+ /**
146
+ * Memoized handler for state changes with accessibility announcements
147
+ * This ensures screen readers announce the new state immediately
148
+ */
149
+ const handlePressedChange = React.useCallback(
150
+ (newPressed: boolean) => {
151
+ const accessibleName = getAccessibleName();
152
+ // Announce the state change for screen readers
153
+ announce(`${accessibleName} ${newPressed ? 'pressed' : 'unpressed'}`);
154
+ // Call the user's change handler
155
+ onPressedChange?.(newPressed);
156
+ },
157
+ [announce, onPressedChange, getAccessibleName],
158
+ );
159
+
160
+ // Development-only warning for controlled/uncontrolled pattern
161
+ // This helps developers avoid common state management mistakes
162
+ React.useEffect(() => {
163
+ if (process.env.NODE_ENV === 'development' && pressed !== undefined && onPressedChange === undefined) {
164
+ console.warn(
165
+ 'ToggleIconButton: You provided a `pressed` prop without an `onPressedChange` handler. ' +
166
+ 'This will result in a read-only toggle button. If you want the button to be interactive, ' +
167
+ 'you should provide an `onPressedChange` handler.',
168
+ );
169
+ }
170
+ }, [pressed, onPressedChange]);
171
+
172
+ // Render the toggle icon button using Radix UI's Toggle primitive
173
+ // This provides proper ARIA attributes and keyboard navigation
174
+ // The IconButton component handles accessibility validation internally
32
175
  return (
33
176
  <Toggle.Root
34
177
  pressed={pressed}
35
- onPressedChange={onPressedChange}
178
+ onPressedChange={handlePressedChange}
36
179
  defaultPressed={defaultPressed}
37
180
  asChild
38
181
  >
@@ -2,12 +2,12 @@
2
2
  box-sizing: border-box;
3
3
  padding: var(--space-1) var(--space-2);
4
4
  background-color: var(--gray-12);
5
- border-radius: var(--radius-2);
5
+ border-radius: var(--radius-1);
6
6
 
7
7
  transform-origin: var(--radix-tooltip-content-transform-origin);
8
8
 
9
- animation-duration: 140ms;
10
- animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
9
+ animation-duration: var(--duration-2);
10
+ animation-timing-function: var(--ease-3);
11
11
 
12
12
  @media (prefers-reduced-motion: no-preference) {
13
13
  &:where([data-state='delayed-open']) {
@@ -0,0 +1 @@
1
+ export { useLiveAnnouncer } from './use-live-announcer.js';
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * Hook for making live announcements to screen readers
5
+ * Creates a hidden aria-live region for announcing dynamic content changes
6
+ */
7
+ export function useLiveAnnouncer() {
8
+
9
+ // Create aria-live region if it doesn't exist
10
+ React.useEffect(() => {
11
+ let liveRegion = document.getElementById('rt-live-announcer');
12
+
13
+ if (!liveRegion) {
14
+ liveRegion = document.createElement('div');
15
+ liveRegion.id = 'rt-live-announcer';
16
+ liveRegion.setAttribute('aria-live', 'polite');
17
+ liveRegion.setAttribute('aria-atomic', 'true');
18
+ liveRegion.style.cssText = `
19
+ position: absolute;
20
+ left: -10000px;
21
+ width: 1px;
22
+ height: 1px;
23
+ overflow: hidden;
24
+ clip: rect(0, 0, 0, 0);
25
+ white-space: nowrap;
26
+ `;
27
+ document.body.appendChild(liveRegion);
28
+ }
29
+
30
+ return () => {
31
+ // Clean up on unmount if no other components are using it
32
+ if (liveRegion && !liveRegion.hasChildNodes()) {
33
+ liveRegion.remove();
34
+ }
35
+ };
36
+ }, []);
37
+
38
+ const announce = React.useCallback((message: string) => {
39
+ const liveRegion = document.getElementById('rt-live-announcer');
40
+ if (liveRegion) {
41
+ // Clear previous announcements
42
+ liveRegion.textContent = '';
43
+
44
+ // Add new announcement with a small delay to ensure it's announced
45
+ setTimeout(() => {
46
+ liveRegion.textContent = message;
47
+ }, 100);
48
+ }
49
+ }, []);
50
+
51
+ return announce;
52
+ }
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './components/index.js';
2
+ export * from './hooks/index.js';