@workos-inc/widgets 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +68 -1
  2. package/dist/cjs/card-list.d.ts +6 -0
  3. package/dist/cjs/card-list.d.ts.map +1 -0
  4. package/dist/cjs/card-list.js +13 -0
  5. package/dist/cjs/card-list.js.map +1 -0
  6. package/dist/cjs/index.d.ts +3 -0
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js +7 -1
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/lib/add-mfa-dialog.d.ts +9 -0
  11. package/dist/cjs/lib/add-mfa-dialog.d.ts.map +1 -0
  12. package/dist/cjs/lib/add-mfa-dialog.js +135 -0
  13. package/dist/cjs/lib/add-mfa-dialog.js.map +1 -0
  14. package/dist/cjs/lib/api/user.d.ts +13 -57
  15. package/dist/cjs/lib/api/user.d.ts.map +1 -1
  16. package/dist/cjs/lib/api/user.js +44 -314
  17. package/dist/cjs/lib/api/user.js.map +1 -1
  18. package/dist/cjs/lib/change-password-dialog.d.ts +8 -0
  19. package/dist/cjs/lib/change-password-dialog.d.ts.map +1 -0
  20. package/dist/cjs/lib/change-password-dialog.js +97 -0
  21. package/dist/cjs/lib/change-password-dialog.js.map +1 -0
  22. package/dist/cjs/lib/copy-button.d.ts +8 -0
  23. package/dist/cjs/lib/copy-button.d.ts.map +1 -0
  24. package/dist/cjs/lib/copy-button.js +63 -0
  25. package/dist/cjs/lib/copy-button.js.map +1 -0
  26. package/dist/cjs/lib/delete-user-dialog.d.ts +2 -2
  27. package/dist/cjs/lib/delete-user-dialog.d.ts.map +1 -1
  28. package/dist/cjs/lib/delete-user-dialog.js +1 -1
  29. package/dist/cjs/lib/delete-user-dialog.js.map +1 -1
  30. package/dist/cjs/lib/edit-user-profile-dialog.d.ts +10 -0
  31. package/dist/cjs/lib/edit-user-profile-dialog.d.ts.map +1 -0
  32. package/dist/cjs/lib/edit-user-profile-dialog.js +85 -0
  33. package/dist/cjs/lib/edit-user-profile-dialog.js.map +1 -0
  34. package/dist/cjs/lib/edit-user-role-dialog.d.ts +12 -0
  35. package/dist/cjs/lib/edit-user-role-dialog.d.ts.map +1 -0
  36. package/dist/cjs/lib/{edit-user-details-dialog.js → edit-user-role-dialog.js} +11 -7
  37. package/dist/cjs/lib/edit-user-role-dialog.js.map +1 -0
  38. package/dist/cjs/lib/elements.d.ts +1 -0
  39. package/dist/cjs/lib/elements.d.ts.map +1 -1
  40. package/dist/cjs/lib/elements.js +10 -4
  41. package/dist/cjs/lib/elements.js.map +1 -1
  42. package/dist/cjs/lib/elevated-access.d.ts +8 -0
  43. package/dist/cjs/lib/elevated-access.d.ts.map +1 -0
  44. package/dist/cjs/lib/elevated-access.js +130 -0
  45. package/dist/cjs/lib/elevated-access.js.map +1 -0
  46. package/dist/cjs/lib/generic-error.d.ts +4 -0
  47. package/dist/cjs/lib/generic-error.d.ts.map +1 -0
  48. package/dist/cjs/lib/generic-error.js +57 -0
  49. package/dist/cjs/lib/generic-error.js.map +1 -0
  50. package/dist/cjs/lib/icon-panel.d.ts +3 -0
  51. package/dist/cjs/lib/icon-panel.d.ts.map +1 -0
  52. package/dist/cjs/lib/icon-panel.js +16 -0
  53. package/dist/cjs/lib/icon-panel.js.map +1 -0
  54. package/dist/cjs/lib/icons.d.ts +3 -0
  55. package/dist/cjs/lib/icons.d.ts.map +1 -0
  56. package/dist/cjs/lib/icons.js +8 -0
  57. package/dist/cjs/lib/icons.js.map +1 -0
  58. package/dist/cjs/lib/invite-user-dialog.d.ts.map +1 -1
  59. package/dist/cjs/lib/invite-user-dialog.js +7 -5
  60. package/dist/cjs/lib/invite-user-dialog.js.map +1 -1
  61. package/dist/cjs/lib/logout-all-sessions-dialog.d.ts +9 -0
  62. package/dist/cjs/lib/logout-all-sessions-dialog.d.ts.map +1 -0
  63. package/dist/cjs/lib/logout-all-sessions-dialog.js +52 -0
  64. package/dist/cjs/lib/logout-all-sessions-dialog.js.map +1 -0
  65. package/dist/cjs/lib/logout-dialog.d.ts +10 -0
  66. package/dist/cjs/lib/logout-dialog.d.ts.map +1 -0
  67. package/dist/cjs/lib/logout-dialog.js +58 -0
  68. package/dist/cjs/lib/logout-dialog.js.map +1 -0
  69. package/dist/cjs/lib/marker.d.ts +14 -0
  70. package/dist/cjs/lib/marker.d.ts.map +1 -0
  71. package/dist/cjs/lib/marker.js +38 -0
  72. package/dist/cjs/lib/marker.js.map +1 -0
  73. package/dist/cjs/lib/oauth-icons.d.ts +4 -0
  74. package/dist/cjs/lib/oauth-icons.d.ts.map +1 -0
  75. package/dist/cjs/lib/oauth-icons.js +67 -0
  76. package/dist/cjs/lib/oauth-icons.js.map +1 -0
  77. package/dist/cjs/lib/organization-switcher.d.ts +24 -0
  78. package/dist/cjs/lib/organization-switcher.d.ts.map +1 -0
  79. package/dist/cjs/lib/organization-switcher.js +35 -0
  80. package/dist/cjs/lib/organization-switcher.js.map +1 -0
  81. package/dist/cjs/lib/otp-input.d.ts +20 -0
  82. package/dist/cjs/lib/otp-input.d.ts.map +1 -0
  83. package/dist/cjs/lib/otp-input.js +174 -0
  84. package/dist/cjs/lib/otp-input.js.map +1 -0
  85. package/dist/cjs/lib/resend-invite-dialog.d.ts +2 -2
  86. package/dist/cjs/lib/resend-invite-dialog.d.ts.map +1 -1
  87. package/dist/cjs/lib/resend-invite-dialog.js +1 -1
  88. package/dist/cjs/lib/resend-invite-dialog.js.map +1 -1
  89. package/dist/cjs/lib/reset-mfa-dialog.d.ts +9 -0
  90. package/dist/cjs/lib/reset-mfa-dialog.d.ts.map +1 -0
  91. package/dist/cjs/lib/reset-mfa-dialog.js +60 -0
  92. package/dist/cjs/lib/reset-mfa-dialog.js.map +1 -0
  93. package/dist/cjs/lib/revoke-invite-dialog.d.ts +2 -2
  94. package/dist/cjs/lib/revoke-invite-dialog.d.ts.map +1 -1
  95. package/dist/cjs/lib/revoke-invite-dialog.js +1 -1
  96. package/dist/cjs/lib/revoke-invite-dialog.js.map +1 -1
  97. package/dist/cjs/lib/save-button.d.ts +11 -0
  98. package/dist/cjs/lib/save-button.d.ts.map +1 -0
  99. package/dist/cjs/lib/save-button.js +47 -0
  100. package/dist/cjs/lib/save-button.js.map +1 -0
  101. package/dist/cjs/lib/set-password-dialog.d.ts +8 -0
  102. package/dist/cjs/lib/set-password-dialog.d.ts.map +1 -0
  103. package/dist/cjs/lib/set-password-dialog.js +80 -0
  104. package/dist/cjs/lib/set-password-dialog.js.map +1 -0
  105. package/dist/cjs/lib/use-dialog-close.d.ts +2 -0
  106. package/dist/cjs/lib/use-dialog-close.d.ts.map +1 -0
  107. package/dist/cjs/lib/use-dialog-close.js +43 -0
  108. package/dist/cjs/lib/use-dialog-close.js.map +1 -0
  109. package/dist/cjs/lib/use-security-settings.d.ts +11 -0
  110. package/dist/cjs/lib/use-security-settings.d.ts.map +1 -0
  111. package/dist/cjs/lib/use-security-settings.js +39 -0
  112. package/dist/cjs/lib/use-security-settings.js.map +1 -0
  113. package/dist/cjs/lib/user-actions-dropdown.d.ts +2 -2
  114. package/dist/cjs/lib/user-actions-dropdown.d.ts.map +1 -1
  115. package/dist/cjs/lib/user-actions-dropdown.js +8 -4
  116. package/dist/cjs/lib/user-actions-dropdown.js.map +1 -1
  117. package/dist/cjs/lib/user-profile.d.ts +11 -0
  118. package/dist/cjs/lib/user-profile.d.ts.map +1 -0
  119. package/dist/cjs/lib/user-profile.js +36 -0
  120. package/dist/cjs/lib/user-profile.js.map +1 -0
  121. package/dist/cjs/lib/user-security.d.ts +11 -0
  122. package/dist/cjs/lib/user-security.d.ts.map +1 -0
  123. package/dist/cjs/lib/user-security.js +64 -0
  124. package/dist/cjs/lib/user-security.js.map +1 -0
  125. package/dist/cjs/lib/user-sessions.d.ts +12 -0
  126. package/dist/cjs/lib/user-sessions.d.ts.map +1 -0
  127. package/dist/cjs/lib/user-sessions.js +72 -0
  128. package/dist/cjs/lib/user-sessions.js.map +1 -0
  129. package/dist/cjs/lib/users-filter.d.ts +2 -2
  130. package/dist/cjs/lib/users-filter.d.ts.map +1 -1
  131. package/dist/cjs/lib/users-filter.js.map +1 -1
  132. package/dist/cjs/lib/users-management-context.d.ts +0 -9
  133. package/dist/cjs/lib/users-management-context.d.ts.map +1 -1
  134. package/dist/cjs/lib/users-management-context.js +13 -26
  135. package/dist/cjs/lib/users-management-context.js.map +1 -1
  136. package/dist/cjs/lib/users-management-state.d.ts +3 -3
  137. package/dist/cjs/lib/users-management-state.d.ts.map +1 -1
  138. package/dist/cjs/lib/users-management-state.js.map +1 -1
  139. package/dist/cjs/lib/users-management.d.ts +3 -4
  140. package/dist/cjs/lib/users-management.d.ts.map +1 -1
  141. package/dist/cjs/lib/users-management.js +8 -26
  142. package/dist/cjs/lib/users-management.js.map +1 -1
  143. package/dist/cjs/lib/utils.d.ts +10 -2
  144. package/dist/cjs/lib/utils.d.ts.map +1 -1
  145. package/dist/cjs/lib/utils.js +18 -0
  146. package/dist/cjs/lib/utils.js.map +1 -1
  147. package/dist/cjs/organization-switcher.client.d.ts +8 -0
  148. package/dist/cjs/organization-switcher.client.d.ts.map +1 -0
  149. package/dist/cjs/organization-switcher.client.js +37 -0
  150. package/dist/cjs/organization-switcher.client.js.map +1 -0
  151. package/dist/cjs/user-profile.client.d.ts +7 -0
  152. package/dist/cjs/user-profile.client.d.ts.map +1 -0
  153. package/dist/cjs/user-profile.client.js +31 -0
  154. package/dist/cjs/user-profile.client.js.map +1 -0
  155. package/dist/cjs/user-security.client.d.ts +7 -0
  156. package/dist/cjs/user-security.client.d.ts.map +1 -0
  157. package/dist/cjs/user-security.client.js +27 -0
  158. package/dist/cjs/user-security.client.js.map +1 -0
  159. package/dist/cjs/user-sessions.client.d.ts +12 -0
  160. package/dist/cjs/user-sessions.client.d.ts.map +1 -0
  161. package/dist/cjs/user-sessions.client.js +48 -0
  162. package/dist/cjs/user-sessions.client.js.map +1 -0
  163. package/dist/cjs/users-management.client.d.ts +2 -1
  164. package/dist/cjs/users-management.client.d.ts.map +1 -1
  165. package/dist/cjs/users-management.client.js +12 -43
  166. package/dist/cjs/users-management.client.js.map +1 -1
  167. package/dist/esm/card-list.d.ts +6 -0
  168. package/dist/esm/card-list.d.ts.map +1 -0
  169. package/dist/esm/card-list.js +9 -0
  170. package/dist/esm/card-list.js.map +1 -0
  171. package/dist/esm/index.d.ts +3 -0
  172. package/dist/esm/index.d.ts.map +1 -1
  173. package/dist/esm/index.js +3 -0
  174. package/dist/esm/index.js.map +1 -1
  175. package/dist/esm/lib/add-mfa-dialog.d.ts +9 -0
  176. package/dist/esm/lib/add-mfa-dialog.d.ts.map +1 -0
  177. package/dist/esm/lib/add-mfa-dialog.js +109 -0
  178. package/dist/esm/lib/add-mfa-dialog.js.map +1 -0
  179. package/dist/esm/lib/api/user.d.ts +13 -57
  180. package/dist/esm/lib/api/user.d.ts.map +1 -1
  181. package/dist/esm/lib/api/user.js +44 -313
  182. package/dist/esm/lib/api/user.js.map +1 -1
  183. package/dist/esm/lib/change-password-dialog.d.ts +8 -0
  184. package/dist/esm/lib/change-password-dialog.d.ts.map +1 -0
  185. package/dist/esm/lib/change-password-dialog.js +71 -0
  186. package/dist/esm/lib/change-password-dialog.js.map +1 -0
  187. package/dist/esm/lib/copy-button.d.ts +8 -0
  188. package/dist/esm/lib/copy-button.d.ts.map +1 -0
  189. package/dist/esm/lib/copy-button.js +37 -0
  190. package/dist/esm/lib/copy-button.js.map +1 -0
  191. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  192. package/dist/esm/lib/delete-user-dialog.d.ts.map +1 -1
  193. package/dist/esm/lib/delete-user-dialog.js +1 -1
  194. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  195. package/dist/esm/lib/edit-user-profile-dialog.d.ts +10 -0
  196. package/dist/esm/lib/edit-user-profile-dialog.d.ts.map +1 -0
  197. package/dist/esm/lib/edit-user-profile-dialog.js +59 -0
  198. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -0
  199. package/dist/esm/lib/edit-user-role-dialog.d.ts +12 -0
  200. package/dist/esm/lib/edit-user-role-dialog.d.ts.map +1 -0
  201. package/dist/esm/lib/{edit-user-details-dialog.js → edit-user-role-dialog.js} +10 -6
  202. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -0
  203. package/dist/esm/lib/elements.d.ts +1 -0
  204. package/dist/esm/lib/elements.d.ts.map +1 -1
  205. package/dist/esm/lib/elements.js +9 -3
  206. package/dist/esm/lib/elements.js.map +1 -1
  207. package/dist/esm/lib/elevated-access.d.ts +8 -0
  208. package/dist/esm/lib/elevated-access.d.ts.map +1 -0
  209. package/dist/esm/lib/elevated-access.js +104 -0
  210. package/dist/esm/lib/elevated-access.js.map +1 -0
  211. package/dist/esm/lib/generic-error.d.ts +4 -0
  212. package/dist/esm/lib/generic-error.d.ts.map +1 -0
  213. package/dist/esm/lib/generic-error.js +31 -0
  214. package/dist/esm/lib/generic-error.js.map +1 -0
  215. package/dist/esm/lib/icon-panel.d.ts +3 -0
  216. package/dist/esm/lib/icon-panel.d.ts.map +1 -0
  217. package/dist/esm/lib/icon-panel.js +13 -0
  218. package/dist/esm/lib/icon-panel.js.map +1 -0
  219. package/dist/esm/lib/icons.d.ts +3 -0
  220. package/dist/esm/lib/icons.d.ts.map +1 -0
  221. package/dist/esm/lib/icons.js +5 -0
  222. package/dist/esm/lib/icons.js.map +1 -0
  223. package/dist/esm/lib/invite-user-dialog.d.ts.map +1 -1
  224. package/dist/esm/lib/invite-user-dialog.js +7 -5
  225. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  226. package/dist/esm/lib/logout-all-sessions-dialog.d.ts +9 -0
  227. package/dist/esm/lib/logout-all-sessions-dialog.d.ts.map +1 -0
  228. package/dist/esm/lib/logout-all-sessions-dialog.js +26 -0
  229. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -0
  230. package/dist/esm/lib/logout-dialog.d.ts +10 -0
  231. package/dist/esm/lib/logout-dialog.d.ts.map +1 -0
  232. package/dist/esm/lib/logout-dialog.js +32 -0
  233. package/dist/esm/lib/logout-dialog.js.map +1 -0
  234. package/dist/esm/lib/marker.d.ts +14 -0
  235. package/dist/esm/lib/marker.d.ts.map +1 -0
  236. package/dist/esm/lib/marker.js +9 -0
  237. package/dist/esm/lib/marker.js.map +1 -0
  238. package/dist/esm/lib/oauth-icons.d.ts +4 -0
  239. package/dist/esm/lib/oauth-icons.d.ts.map +1 -0
  240. package/dist/esm/lib/oauth-icons.js +39 -0
  241. package/dist/esm/lib/oauth-icons.js.map +1 -0
  242. package/dist/esm/lib/organization-switcher.d.ts +24 -0
  243. package/dist/esm/lib/organization-switcher.d.ts.map +1 -0
  244. package/dist/esm/lib/organization-switcher.js +29 -0
  245. package/dist/esm/lib/organization-switcher.js.map +1 -0
  246. package/dist/esm/lib/otp-input.d.ts +20 -0
  247. package/dist/esm/lib/otp-input.d.ts.map +1 -0
  248. package/dist/esm/lib/otp-input.js +148 -0
  249. package/dist/esm/lib/otp-input.js.map +1 -0
  250. package/dist/esm/lib/resend-invite-dialog.d.ts +2 -2
  251. package/dist/esm/lib/resend-invite-dialog.d.ts.map +1 -1
  252. package/dist/esm/lib/resend-invite-dialog.js +1 -1
  253. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  254. package/dist/esm/lib/reset-mfa-dialog.d.ts +9 -0
  255. package/dist/esm/lib/reset-mfa-dialog.d.ts.map +1 -0
  256. package/dist/esm/lib/reset-mfa-dialog.js +34 -0
  257. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -0
  258. package/dist/esm/lib/revoke-invite-dialog.d.ts +2 -2
  259. package/dist/esm/lib/revoke-invite-dialog.d.ts.map +1 -1
  260. package/dist/esm/lib/revoke-invite-dialog.js +1 -1
  261. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  262. package/dist/esm/lib/save-button.d.ts +11 -0
  263. package/dist/esm/lib/save-button.d.ts.map +1 -0
  264. package/dist/esm/lib/save-button.js +44 -0
  265. package/dist/esm/lib/save-button.js.map +1 -0
  266. package/dist/esm/lib/set-password-dialog.d.ts +8 -0
  267. package/dist/esm/lib/set-password-dialog.d.ts.map +1 -0
  268. package/dist/esm/lib/set-password-dialog.js +54 -0
  269. package/dist/esm/lib/set-password-dialog.js.map +1 -0
  270. package/dist/esm/lib/use-dialog-close.d.ts +2 -0
  271. package/dist/esm/lib/use-dialog-close.d.ts.map +1 -0
  272. package/dist/esm/lib/use-dialog-close.js +17 -0
  273. package/dist/esm/lib/use-dialog-close.js.map +1 -0
  274. package/dist/esm/lib/use-security-settings.d.ts +11 -0
  275. package/dist/esm/lib/use-security-settings.d.ts.map +1 -0
  276. package/dist/esm/lib/use-security-settings.js +36 -0
  277. package/dist/esm/lib/use-security-settings.js.map +1 -0
  278. package/dist/esm/lib/user-actions-dropdown.d.ts +2 -2
  279. package/dist/esm/lib/user-actions-dropdown.d.ts.map +1 -1
  280. package/dist/esm/lib/user-actions-dropdown.js +8 -4
  281. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  282. package/dist/esm/lib/user-profile.d.ts +11 -0
  283. package/dist/esm/lib/user-profile.d.ts.map +1 -0
  284. package/dist/esm/lib/user-profile.js +27 -0
  285. package/dist/esm/lib/user-profile.js.map +1 -0
  286. package/dist/esm/lib/user-security.d.ts +11 -0
  287. package/dist/esm/lib/user-security.d.ts.map +1 -0
  288. package/dist/esm/lib/user-security.js +32 -0
  289. package/dist/esm/lib/user-security.js.map +1 -0
  290. package/dist/esm/lib/user-sessions.d.ts +12 -0
  291. package/dist/esm/lib/user-sessions.d.ts.map +1 -0
  292. package/dist/esm/lib/user-sessions.js +40 -0
  293. package/dist/esm/lib/user-sessions.js.map +1 -0
  294. package/dist/esm/lib/users-filter.d.ts +2 -2
  295. package/dist/esm/lib/users-filter.d.ts.map +1 -1
  296. package/dist/esm/lib/users-filter.js.map +1 -1
  297. package/dist/esm/lib/users-management-context.d.ts +0 -9
  298. package/dist/esm/lib/users-management-context.d.ts.map +1 -1
  299. package/dist/esm/lib/users-management-context.js +13 -25
  300. package/dist/esm/lib/users-management-context.js.map +1 -1
  301. package/dist/esm/lib/users-management-state.d.ts +3 -3
  302. package/dist/esm/lib/users-management-state.d.ts.map +1 -1
  303. package/dist/esm/lib/users-management-state.js.map +1 -1
  304. package/dist/esm/lib/users-management.d.ts +3 -4
  305. package/dist/esm/lib/users-management.d.ts.map +1 -1
  306. package/dist/esm/lib/users-management.js +9 -27
  307. package/dist/esm/lib/users-management.js.map +1 -1
  308. package/dist/esm/lib/users-search.d.ts +1 -1
  309. package/dist/esm/lib/users-search.d.ts.map +1 -1
  310. package/dist/esm/lib/utils.d.ts +10 -2
  311. package/dist/esm/lib/utils.d.ts.map +1 -1
  312. package/dist/esm/lib/utils.js +16 -0
  313. package/dist/esm/lib/utils.js.map +1 -1
  314. package/dist/esm/organization-switcher.client.d.ts +8 -0
  315. package/dist/esm/organization-switcher.client.d.ts.map +1 -0
  316. package/dist/esm/organization-switcher.client.js +33 -0
  317. package/dist/esm/organization-switcher.client.js.map +1 -0
  318. package/dist/esm/user-profile.client.d.ts +7 -0
  319. package/dist/esm/user-profile.client.d.ts.map +1 -0
  320. package/dist/esm/user-profile.client.js +27 -0
  321. package/dist/esm/user-profile.client.js.map +1 -0
  322. package/dist/esm/user-security.client.d.ts +7 -0
  323. package/dist/esm/user-security.client.d.ts.map +1 -0
  324. package/dist/esm/user-security.client.js +23 -0
  325. package/dist/esm/user-security.client.js.map +1 -0
  326. package/dist/esm/user-sessions.client.d.ts +12 -0
  327. package/dist/esm/user-sessions.client.d.ts.map +1 -0
  328. package/dist/esm/user-sessions.client.js +44 -0
  329. package/dist/esm/user-sessions.client.js.map +1 -0
  330. package/dist/esm/users-management.client.d.ts +2 -1
  331. package/dist/esm/users-management.client.d.ts.map +1 -1
  332. package/dist/esm/users-management.client.js +12 -20
  333. package/dist/esm/users-management.client.js.map +1 -1
  334. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  335. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  336. package/package.json +10 -4
  337. package/src/card-list.tsx +26 -0
  338. package/src/index.ts +3 -0
  339. package/src/lib/add-mfa-dialog.tsx +379 -0
  340. package/src/lib/api/user.ts +54 -458
  341. package/src/lib/card-list.css +3 -0
  342. package/src/lib/change-password-dialog.tsx +290 -0
  343. package/src/lib/copy-button.tsx +53 -0
  344. package/src/lib/delete-user-dialog.tsx +9 -6
  345. package/src/lib/edit-user-profile-dialog.tsx +181 -0
  346. package/src/lib/{edit-user-details-dialog.tsx → edit-user-role-dialog.tsx} +12 -9
  347. package/src/lib/elements.tsx +34 -1
  348. package/src/lib/elevated-access.tsx +261 -0
  349. package/src/lib/generic-error.tsx +70 -0
  350. package/src/lib/icon-panel.tsx +26 -0
  351. package/src/lib/icons.tsx +21 -0
  352. package/src/lib/invite-user-dialog.tsx +15 -10
  353. package/src/lib/logout-all-sessions-dialog.tsx +82 -0
  354. package/src/lib/logout-dialog.tsx +89 -0
  355. package/src/lib/marker.css +81 -0
  356. package/src/lib/marker.tsx +39 -0
  357. package/src/lib/oauth-icons.tsx +138 -0
  358. package/src/lib/organization-switcher.tsx +160 -0
  359. package/src/lib/otp-input.tsx +276 -0
  360. package/src/lib/resend-invite-dialog.tsx +9 -6
  361. package/src/lib/reset-mfa-dialog.tsx +104 -0
  362. package/src/lib/revoke-invite-dialog.tsx +9 -6
  363. package/src/lib/save-button.css +60 -0
  364. package/src/lib/save-button.tsx +113 -0
  365. package/src/lib/set-password-dialog.tsx +204 -0
  366. package/src/lib/use-dialog-close.tsx +19 -0
  367. package/src/lib/use-security-settings.tsx +49 -0
  368. package/src/lib/user-actions-dropdown.tsx +10 -6
  369. package/src/lib/user-profile.tsx +247 -0
  370. package/src/lib/user-security.tsx +187 -0
  371. package/src/lib/user-sessions.tsx +204 -0
  372. package/src/lib/users-filter.tsx +2 -2
  373. package/src/lib/users-management-context.tsx +21 -36
  374. package/src/lib/users-management-state.ts +3 -3
  375. package/src/lib/users-management.tsx +21 -77
  376. package/src/lib/utils.ts +30 -2
  377. package/src/organization-switcher.client.tsx +77 -0
  378. package/src/styles.css +44 -0
  379. package/src/user-profile.client.tsx +51 -0
  380. package/src/user-security.client.tsx +55 -0
  381. package/src/user-sessions.client.tsx +96 -0
  382. package/src/users-management.client.tsx +28 -39
  383. package/dist/cjs/lib/api/role.d.ts +0 -9
  384. package/dist/cjs/lib/api/role.d.ts.map +0 -1
  385. package/dist/cjs/lib/api/role.js +0 -115
  386. package/dist/cjs/lib/api/role.js.map +0 -1
  387. package/dist/cjs/lib/edit-user-details-dialog.d.ts +0 -12
  388. package/dist/cjs/lib/edit-user-details-dialog.d.ts.map +0 -1
  389. package/dist/cjs/lib/edit-user-details-dialog.js.map +0 -1
  390. package/dist/esm/lib/api/role.d.ts +0 -9
  391. package/dist/esm/lib/api/role.d.ts.map +0 -1
  392. package/dist/esm/lib/api/role.js +0 -110
  393. package/dist/esm/lib/api/role.js.map +0 -1
  394. package/dist/esm/lib/edit-user-details-dialog.d.ts +0 -12
  395. package/dist/esm/lib/edit-user-details-dialog.d.ts.map +0 -1
  396. package/dist/esm/lib/edit-user-details-dialog.js.map +0 -1
  397. package/src/lib/api/role.ts +0 -147
@@ -0,0 +1,290 @@
1
+ "use client";
2
+
3
+ import { Callout, Dialog, Flex, Text, VisuallyHidden } from "@radix-ui/themes";
4
+ import * as Form from "@radix-ui/react-form";
5
+ import * as React from "react";
6
+ import { type ReactNode } from "react";
7
+ import {
8
+ DialogContent,
9
+ Label,
10
+ PasswordField,
11
+ PrimaryButton,
12
+ SecondaryButton,
13
+ } from "./elements";
14
+ import { useUpdatePassword } from "@repo/api";
15
+ import { SaveButton } from "./save-button";
16
+
17
+ interface ChangePasswordDialogProps extends Dialog.RootProps {
18
+ children?: ReactNode;
19
+ }
20
+
21
+ export function ChangePasswordDialog({
22
+ children,
23
+ ...props
24
+ }: ChangePasswordDialogProps) {
25
+ const [open, setOpen] = React.useState(false);
26
+
27
+ const handleClose = React.useCallback(() => {
28
+ setOpen(false);
29
+ }, []);
30
+
31
+ return (
32
+ <Dialog.Root
33
+ {...props}
34
+ open={props.open || open}
35
+ onOpenChange={props.onOpenChange || setOpen}
36
+ >
37
+ <Dialog.Trigger>{children}</Dialog.Trigger>
38
+
39
+ <DialogContent maxWidth="480px">
40
+ <Content onClose={handleClose} />
41
+ </DialogContent>
42
+ </Dialog.Root>
43
+ );
44
+ }
45
+
46
+ interface ContentProps {
47
+ onClose: () => void;
48
+ }
49
+
50
+ function Content({ onClose }: ContentProps) {
51
+ const changePassword = useUpdatePassword({
52
+ mutation: {
53
+ onError: (error) => {
54
+ const errorMsg = getMutationErrorMessage(error);
55
+ if (errorMsg === "Invalid credentials") {
56
+ setServerErrors({
57
+ currentPassword:
58
+ "Your current password is incorrect. Please, try again.",
59
+ });
60
+ }
61
+ },
62
+ },
63
+ });
64
+ const [disableSubmit, setDisableSubmit] = React.useState(true);
65
+ const [serverErrors, setServerErrors] = React.useState<{
66
+ currentPassword?: string;
67
+ password?: string;
68
+ confirmPassword?: string;
69
+ }>({});
70
+
71
+ const errorMessage = React.useMemo(() => {
72
+ if (changePassword.error) {
73
+ return getMutationErrorMessage(changePassword.error);
74
+ }
75
+
76
+ return null;
77
+ }, [changePassword.error]);
78
+
79
+ const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
80
+ event.preventDefault();
81
+
82
+ const formData = new FormData(event.currentTarget);
83
+ const currentPassword = formData.get("oldPassword")?.toString() ?? "";
84
+ const newPassword = formData.get("password")?.toString() ?? "";
85
+
86
+ changePassword.mutate({
87
+ data: { currentPassword, newPassword },
88
+ });
89
+ };
90
+
91
+ return (
92
+ <>
93
+ <Dialog.Title mb="5">Change Password</Dialog.Title>
94
+ <VisuallyHidden>
95
+ <Dialog.Description>Change your account password</Dialog.Description>
96
+ </VisuallyHidden>
97
+
98
+ {errorMessage && errorMessage !== "Invalid credentials" ? (
99
+ <Callout.Root color="red" my="-2">
100
+ <Callout.Text>{errorMessage}</Callout.Text>
101
+ </Callout.Root>
102
+ ) : null}
103
+
104
+ <Form.Root
105
+ onSubmit={handleSubmit}
106
+ onChange={(event) => {
107
+ const formData = new FormData(event.currentTarget);
108
+ const currentPassword = formData.get("oldPassword")?.toString() ?? "";
109
+ const newPassword = formData.get("password")?.toString() ?? "";
110
+ const confirmPassword =
111
+ formData.get("confirmPassword")?.toString() ?? "";
112
+
113
+ setDisableSubmit(
114
+ currentPassword === "" ||
115
+ newPassword === "" ||
116
+ confirmPassword === "",
117
+ );
118
+ setServerErrors({});
119
+ }}
120
+ onClearServerErrors={() => {
121
+ setServerErrors({});
122
+ }}
123
+ >
124
+ <Flex mt="5" direction="column" gap="4">
125
+ <Form.Field
126
+ name="oldPassword"
127
+ asChild
128
+ serverInvalid={!serverErrors.currentPassword}
129
+ >
130
+ <Flex direction="column" gap="2">
131
+ <Form.Label asChild>
132
+ <Label>Enter your current password</Label>
133
+ </Form.Label>
134
+
135
+ <Form.Control asChild>
136
+ <PasswordField
137
+ autoFocus
138
+ required
139
+ disabled={
140
+ changePassword.isPending || changePassword.isSuccess
141
+ }
142
+ autoComplete="current-password"
143
+ placeholder="Current password"
144
+ />
145
+ </Form.Control>
146
+
147
+ <Form.Message match="valueMissing" asChild>
148
+ <Text size="2" color="red">
149
+ Please enter your current password
150
+ </Text>
151
+ </Form.Message>
152
+
153
+ {serverErrors.currentPassword && (
154
+ <Form.Message asChild>
155
+ <Text size="2" color="red">
156
+ {serverErrors.currentPassword}
157
+ </Text>
158
+ </Form.Message>
159
+ )}
160
+ </Flex>
161
+ </Form.Field>
162
+
163
+ <Form.Field
164
+ name="password"
165
+ asChild
166
+ serverInvalid={!serverErrors.password}
167
+ >
168
+ <Flex direction="column" gap="2">
169
+ <Form.Label asChild>
170
+ <Label>Enter your new password</Label>
171
+ </Form.Label>
172
+
173
+ <Form.Control asChild>
174
+ <PasswordField
175
+ autoComplete="new-password"
176
+ placeholder="New password"
177
+ required
178
+ disabled={
179
+ changePassword.isPending || changePassword.isSuccess
180
+ }
181
+ />
182
+ </Form.Control>
183
+
184
+ <Form.Message match="valueMissing" asChild>
185
+ <Text size="2" color="red">
186
+ Please enter your new password
187
+ </Text>
188
+ </Form.Message>
189
+ <Form.Message match={(value) => value.length < 8} asChild>
190
+ <Text size="2" color="red">
191
+ Password must be at least 8 characters
192
+ </Text>
193
+ </Form.Message>
194
+ <Form.Message
195
+ match={(value, formData) =>
196
+ value === formData.get("oldPassword")
197
+ }
198
+ asChild
199
+ >
200
+ <Text size="2" color="red">
201
+ You cannot reuse your current password
202
+ </Text>
203
+ </Form.Message>
204
+ </Flex>
205
+ </Form.Field>
206
+
207
+ <Form.Field
208
+ name="confirmPassword"
209
+ asChild
210
+ serverInvalid={!serverErrors.confirmPassword}
211
+ >
212
+ <Flex direction="column" gap="2">
213
+ <Form.Label asChild>
214
+ <Label>Confirm your new password</Label>
215
+ </Form.Label>
216
+
217
+ <Form.Control asChild>
218
+ <PasswordField
219
+ autoComplete="new-password"
220
+ placeholder="Confirm new password"
221
+ required
222
+ disabled={
223
+ changePassword.isPending || changePassword.isSuccess
224
+ }
225
+ />
226
+ </Form.Control>
227
+ <Form.Message match="valueMissing" asChild>
228
+ <Text size="2" color="red">
229
+ Please confirm your new password
230
+ </Text>
231
+ </Form.Message>
232
+ <Form.Message
233
+ match={(value, formData) => value !== formData.get("password")}
234
+ asChild
235
+ >
236
+ <Text size="2" color="red">
237
+ The new passwords you entered don’t match.
238
+ </Text>
239
+ </Form.Message>
240
+ </Flex>
241
+ </Form.Field>
242
+ </Flex>
243
+
244
+ <Flex mt="5" gap="3" justify="end">
245
+ <Dialog.Close>
246
+ <SecondaryButton
247
+ type="button"
248
+ disabled={changePassword.isPending || changePassword.isSuccess}
249
+ >
250
+ Cancel
251
+ </SecondaryButton>
252
+ </Dialog.Close>
253
+
254
+ <SaveButton
255
+ asChild
256
+ loading={changePassword.isPending}
257
+ done={changePassword.isSuccess}
258
+ onDone={onClose}
259
+ >
260
+ <PrimaryButton type="submit" disabled={disableSubmit}>
261
+ Change password
262
+ </PrimaryButton>
263
+ </SaveButton>
264
+ </Flex>
265
+ </Form.Root>
266
+
267
+ {/* mirror errors in a live region */}
268
+ <VisuallyHidden asChild>
269
+ <section aria-live="polite">{errorMessage}</section>
270
+ </VisuallyHidden>
271
+ </>
272
+ );
273
+ }
274
+
275
+ function getMutationErrorMessage(error: unknown) {
276
+ if (error instanceof Error) {
277
+ return error.message;
278
+ }
279
+
280
+ if (
281
+ typeof error === "object" &&
282
+ error !== null &&
283
+ "message" in error &&
284
+ typeof error.message === "string"
285
+ ) {
286
+ return error.message;
287
+ }
288
+
289
+ return "Something went wrong. Please try again.";
290
+ }
@@ -0,0 +1,53 @@
1
+ import * as React from "react";
2
+ import { CheckIcon, CopyIcon } from "@radix-ui/react-icons";
3
+ import { Slot, Slottable } from "@radix-ui/themes";
4
+
5
+ interface CopyButtonProps
6
+ extends React.ButtonHTMLAttributes<HTMLButtonElement> {
7
+ value: string;
8
+ asChild?: boolean;
9
+ }
10
+
11
+ export const CopyButton = React.forwardRef<HTMLButtonElement, CopyButtonProps>(
12
+ function CopyButton({ value, asChild, children, style, ...props }, ref) {
13
+ const [hasCopied, setHasCopied] = React.useState(false);
14
+ const Comp = asChild ? Slot : "button";
15
+ const timeoutRef = React.useRef<NodeJS.Timeout>();
16
+
17
+ const handleClick = async () => {
18
+ try {
19
+ console.log("Copying text:", value);
20
+ await navigator.clipboard.writeText(value);
21
+ setHasCopied(true);
22
+
23
+ // Clear any existing timeout
24
+ if (timeoutRef.current) {
25
+ clearTimeout(timeoutRef.current);
26
+ }
27
+
28
+ // Set new timeout
29
+ timeoutRef.current = setTimeout(() => {
30
+ setHasCopied(false);
31
+ }, 3000);
32
+ } catch (err) {
33
+ console.error("Failed to copy text:", err);
34
+ }
35
+ };
36
+
37
+ // Cleanup timeout on unmount
38
+ React.useEffect(() => {
39
+ return () => {
40
+ if (timeoutRef.current) {
41
+ clearTimeout(timeoutRef.current);
42
+ }
43
+ };
44
+ }, []);
45
+
46
+ return (
47
+ <Comp onPointerUp={handleClick} ref={ref} {...props}>
48
+ {hasCopied ? <CheckIcon /> : <CopyIcon />}
49
+ <Slottable>{children}</Slottable>
50
+ </Comp>
51
+ );
52
+ },
53
+ );
@@ -10,17 +10,17 @@ import {
10
10
  } from "@radix-ui/themes";
11
11
  import { type ReactNode, useRef } from "react";
12
12
  import { useDeleteUser } from "./api/user";
13
- import type { User } from "./api/user";
14
13
  import {
15
14
  AlertDialogContent,
16
15
  DestructiveButton,
17
16
  SecondaryButton,
18
17
  } from "./elements";
18
+ import { Member } from "@repo/api";
19
19
 
20
20
  interface DeleteUserDialogProps extends AlertDialog.RootProps {
21
21
  open: boolean;
22
22
  onOpenChange: (open: boolean) => void;
23
- user: User;
23
+ user: Member;
24
24
  children?: ReactNode;
25
25
  }
26
26
 
@@ -33,11 +33,14 @@ export function DeleteUserDialog({
33
33
  const inputRef = useRef<HTMLInputElement>(null);
34
34
 
35
35
  const onSubmitForm = () => {
36
- deleteUser.mutate(user.id, {
37
- onSuccess: () => {
38
- props.onOpenChange(false);
36
+ deleteUser.mutate(
37
+ { userId: user.id },
38
+ {
39
+ onSuccess: () => {
40
+ props.onOpenChange(false);
41
+ },
39
42
  },
40
- });
43
+ );
41
44
  };
42
45
 
43
46
  return (
@@ -0,0 +1,181 @@
1
+ "use client";
2
+
3
+ import { Callout, Dialog, Flex, Text, VisuallyHidden } from "@radix-ui/themes";
4
+ import { getMeQueryKey, Me, useUpdateMe } from "@repo/api";
5
+ import { useQueryClient } from "@tanstack/react-query";
6
+ import * as React from "react";
7
+ import { type ReactNode } from "react";
8
+ import * as Form from "@radix-ui/react-form";
9
+ import {
10
+ DialogContent,
11
+ Label,
12
+ PrimaryButton,
13
+ SecondaryButton,
14
+ TextField,
15
+ } from "./elements";
16
+ import { SaveButton } from "./save-button";
17
+
18
+ interface EditUserProfileDialogProps extends Dialog.RootProps {
19
+ user: Me;
20
+ children?: ReactNode;
21
+ }
22
+
23
+ export function EditUserProfileDialog({
24
+ children,
25
+ user,
26
+ ...props
27
+ }: EditUserProfileDialogProps) {
28
+ const [open, setOpen] = React.useState(false);
29
+
30
+ const handleClose = React.useCallback(() => {
31
+ setOpen(false);
32
+ }, []);
33
+
34
+ return (
35
+ <Dialog.Root
36
+ {...props}
37
+ open={props.open ?? open}
38
+ onOpenChange={props.onOpenChange ?? setOpen}
39
+ >
40
+ <Dialog.Trigger>{children}</Dialog.Trigger>
41
+
42
+ <DialogContent maxWidth="480px">
43
+ <Content user={user} onClose={handleClose} />
44
+ </DialogContent>
45
+ </Dialog.Root>
46
+ );
47
+ }
48
+
49
+ interface ContentProps extends Pick<EditUserProfileDialogProps, "user"> {
50
+ onClose: () => void;
51
+ }
52
+
53
+ function Content({ user, onClose }: ContentProps) {
54
+ const client = useQueryClient();
55
+ const updateMe = useUpdateMe({
56
+ mutation: {
57
+ onSettled: () => {
58
+ client.invalidateQueries({ queryKey: getMeQueryKey() });
59
+ },
60
+ onSuccess: (newProfile) => {
61
+ client.setQueryData(getMeQueryKey(), {
62
+ ...user,
63
+ firstName: newProfile.firstName || user.firstName,
64
+ lastName: newProfile.lastName || user.lastName,
65
+ });
66
+ },
67
+ },
68
+ });
69
+
70
+ return (
71
+ <>
72
+ <Dialog.Title mb="5">Edit name</Dialog.Title>
73
+ <VisuallyHidden>
74
+ <Dialog.Description>
75
+ Edit the details of <Text weight="bold">{user.email}</Text>
76
+ </Dialog.Description>
77
+ </VisuallyHidden>
78
+
79
+ {updateMe.error ? (
80
+ <Callout.Root color="red" my="-2">
81
+ <Callout.Text>{getMutationErrorMessage(updateMe.error)}</Callout.Text>
82
+ </Callout.Root>
83
+ ) : null}
84
+
85
+ <Form.Root
86
+ onSubmit={async (event) => {
87
+ event.preventDefault();
88
+ const formData = new FormData(event.currentTarget);
89
+ const firstName = formData.get("firstName")?.toString();
90
+ const lastName = formData.get("lastName")?.toString();
91
+ updateMe.mutate({
92
+ data: {
93
+ firstName: firstName ?? undefined,
94
+ lastName: lastName ?? undefined,
95
+ },
96
+ });
97
+ }}
98
+ >
99
+ <Flex my="5" direction="column" gap="4">
100
+ <Form.Field name="firstName" asChild>
101
+ <Flex direction="column" gap="1">
102
+ <Form.Label asChild>
103
+ <Label>First name</Label>
104
+ </Form.Label>
105
+ <Form.Control asChild>
106
+ <TextField
107
+ data-1p-ignore
108
+ autoComplete="given-name"
109
+ defaultValue={user.firstName ?? ""}
110
+ placeholder="Your first name"
111
+ disabled={updateMe.isPending || updateMe.isSuccess}
112
+ />
113
+ </Form.Control>
114
+ </Flex>
115
+ </Form.Field>
116
+
117
+ <Form.Field name="lastName" asChild>
118
+ <Flex direction="column" gap="1">
119
+ <Form.Label asChild>
120
+ <Label>Last name</Label>
121
+ </Form.Label>
122
+ <Form.Control asChild>
123
+ <TextField
124
+ data-1p-ignore
125
+ autoComplete="family-name"
126
+ defaultValue={user.lastName ?? ""}
127
+ placeholder="Your last name"
128
+ disabled={updateMe.isPending || updateMe.isSuccess}
129
+ />
130
+ </Form.Control>
131
+ </Flex>
132
+ </Form.Field>
133
+ </Flex>
134
+
135
+ <Flex mt="5" gap="3" justify="end">
136
+ <Dialog.Close>
137
+ <SecondaryButton
138
+ disabled={updateMe.isPending || updateMe.isSuccess}
139
+ >
140
+ Cancel
141
+ </SecondaryButton>
142
+ </Dialog.Close>
143
+
144
+ <SaveButton
145
+ asChild
146
+ loading={updateMe.isPending}
147
+ done={updateMe.isSuccess}
148
+ onDone={onClose}
149
+ >
150
+ <PrimaryButton>Save</PrimaryButton>
151
+ </SaveButton>
152
+ </Flex>
153
+
154
+ {/* mirror errors in a live region */}
155
+ <VisuallyHidden asChild>
156
+ <section aria-live="polite">
157
+ {getMutationErrorMessage(updateMe.error)}
158
+ </section>
159
+ </VisuallyHidden>
160
+ </Form.Root>
161
+ </>
162
+ );
163
+ }
164
+
165
+ function getMutationErrorMessage(error: unknown) {
166
+ if (error instanceof Error) {
167
+ return error.message;
168
+ }
169
+
170
+ if (
171
+ typeof error === "object" &&
172
+ error !== null &&
173
+ "message" in error &&
174
+ typeof error.message === "string"
175
+ ) {
176
+ return error.message;
177
+ }
178
+
179
+ // TODO Handle server errors
180
+ return "Something went wrong. Please try again.";
181
+ }
@@ -11,7 +11,6 @@ import {
11
11
  } from "@radix-ui/themes";
12
12
  import { type ReactNode, useState } from "react";
13
13
  import { useUpdateUserRole } from "./api/user";
14
- import type { User } from "./api/user";
15
14
  import {
16
15
  DialogContent,
17
16
  PrimaryButton,
@@ -22,31 +21,35 @@ import {
22
21
  Skeleton,
23
22
  } from "./elements";
24
23
  import { getBestName } from "./utils";
25
- import { useRoles } from "./api/role";
24
+ import { Member, useRoles } from "@repo/api";
26
25
 
27
- interface EditUserDialogProps extends Dialog.RootProps {
26
+ interface EditUserRoleDialogProps extends Dialog.RootProps {
28
27
  open: boolean;
29
28
  onOpenChange: (open: boolean) => void;
30
- user: User;
29
+ user: Member;
31
30
  children?: ReactNode;
32
31
  }
33
32
 
34
- export function EditUserDetailsDialog({
33
+ export function EditUserRoleDialog({
35
34
  children,
36
35
  user,
37
36
  ...props
38
- }: EditUserDialogProps) {
37
+ }: EditUserRoleDialogProps) {
39
38
  const displayName = getBestName(user) || user.email;
40
- const rolesQuery = useRoles();
39
+ const rolesQuery = useRoles({
40
+ query: {
41
+ initialData: [],
42
+ },
43
+ });
41
44
  const { data: roles } = rolesQuery;
42
45
  const updateUser = useUpdateUserRole();
43
46
  const [selectedRole, setSelectedRole] = useState(
44
- user.roles[0]?.slug || "Unknown",
47
+ user.roles?.at(0)?.slug || "Unknown",
45
48
  );
46
49
 
47
50
  const onSubmitForm = ({ id, roles }: { id: string; roles: string[] }) => {
48
51
  updateUser.mutate(
49
- { id, data: { roles } },
52
+ { userId: id, data: { roles } },
50
53
  {
51
54
  onSuccess: () => {
52
55
  props.onOpenChange(false);
@@ -39,6 +39,7 @@ import cx from "clsx";
39
39
  import { useElement } from "./widgets-context";
40
40
  import { namespaceClassNames } from "./utils";
41
41
  import { useLayoutEffect } from "./use-layout-effect";
42
+ import { EyeClosedIcon, EyeOpenIcon } from "@radix-ui/react-icons";
42
43
 
43
44
  export const PrimaryButton = React.forwardRef<HTMLButtonElement, ButtonProps>(
44
45
  function PrimaryButton({ className, ...props }, ref) {
@@ -64,6 +65,7 @@ export const SecondaryButton = React.forwardRef<HTMLButtonElement, ButtonProps>(
64
65
  return (
65
66
  <RadixButton
66
67
  ref={ref}
68
+ highContrast
67
69
  className={cx(
68
70
  namespaceClassNames("button", "button--secondary"),
69
71
  className,
@@ -176,7 +178,7 @@ export const SelectItem = React.forwardRef<
176
178
  });
177
179
 
178
180
  export const Label = React.forwardRef<HTMLLabelElement, TextProps>(
179
- function Label({ children, className, ...props }, ref) {
181
+ function Label({ children, className, style = {}, ...props }, ref) {
180
182
  const element = useElement("label");
181
183
  return (
182
184
  // @ts-expect-error: Text props are a complex union type depending on the
@@ -187,6 +189,7 @@ export const Label = React.forwardRef<HTMLLabelElement, TextProps>(
187
189
  weight="bold"
188
190
  size="2"
189
191
  className={cx(namespaceClassNames("label"), className)}
192
+ style={{ width: "fit-content", ...style }}
190
193
  {...props}
191
194
  {...element}
192
195
  >
@@ -225,6 +228,36 @@ export const TextFieldSlot = React.forwardRef<
225
228
  );
226
229
  });
227
230
 
231
+ export const PasswordField = React.forwardRef<
232
+ HTMLInputElement,
233
+ RadixTextField.RootProps
234
+ >(function TextField({ className, ...props }, ref) {
235
+ const element = useElement("textfield");
236
+ const [showPassword, setShowPassword] = React.useState(false);
237
+ return (
238
+ <RadixTextField.Root
239
+ ref={ref}
240
+ variant="surface"
241
+ className={cx(namespaceClassNames("text-field"), className)}
242
+ {...props}
243
+ {...element}
244
+ type={showPassword ? "text" : "password"}
245
+ >
246
+ <RadixTextField.Slot side="right">
247
+ <IconButton
248
+ type="button"
249
+ size="1"
250
+ variant="ghost"
251
+ color="gray"
252
+ onClick={() => setShowPassword(!showPassword)}
253
+ >
254
+ {showPassword ? <EyeOpenIcon /> : <EyeClosedIcon />}
255
+ </IconButton>
256
+ </RadixTextField.Slot>
257
+ </RadixTextField.Root>
258
+ );
259
+ });
260
+
228
261
  export const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(
229
262
  function Badge({ className, ...props }, ref) {
230
263
  const element = useElement("badge");