@workos-inc/widgets 1.6.0 → 1.7.0-pre.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 (275) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/admin-portal-domain-verification.client.d.cts +11 -0
  3. package/dist/cjs/admin-portal-sso-connection.client.d.cts +11 -0
  4. package/dist/cjs/alert-dialog-BlG3_awx.d.cts +25 -0
  5. package/dist/cjs/api-keys.client.d.cts +11 -0
  6. package/dist/cjs/dialog-C15qCLN3.d.cts +23 -0
  7. package/dist/cjs/dropdown-menu-BQ5LtvdR.d.cts +48 -0
  8. package/dist/cjs/index.d.cts +8 -0
  9. package/dist/cjs/lib/add-mfa-dialog.cjs +22 -14
  10. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  11. package/dist/cjs/lib/add-mfa-dialog.d.cts +2 -2
  12. package/dist/cjs/lib/admin-portal-domain-verification.cjs +6 -8
  13. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  14. package/dist/cjs/lib/admin-portal-domain-verification.d.cts +11 -0
  15. package/dist/cjs/lib/admin-portal-sso-connection.cjs +7 -8
  16. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  17. package/dist/cjs/lib/admin-portal-sso-connection.d.cts +11 -0
  18. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +3 -3
  19. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
  20. package/dist/cjs/lib/api-keys/api-keys-search.cjs +2 -6
  21. package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
  22. package/dist/cjs/lib/api-keys/api-keys-table.cjs +18 -19
  23. package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
  24. package/dist/cjs/lib/api-keys/api-keys.cjs +2 -2
  25. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  26. package/dist/cjs/lib/api-keys/api-keys.d.cts +12 -0
  27. package/dist/cjs/lib/api-keys/create-api-key.cjs +20 -14
  28. package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
  29. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +7 -7
  30. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
  31. package/dist/cjs/lib/api-keys/skeleton-table.cjs +3 -2
  32. package/dist/cjs/lib/api-keys/skeleton-table.cjs.map +1 -1
  33. package/dist/cjs/lib/change-password-dialog.cjs +11 -9
  34. package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
  35. package/dist/cjs/lib/change-password-dialog.d.cts +2 -2
  36. package/dist/cjs/lib/copy-button.cjs +51 -29
  37. package/dist/cjs/lib/copy-button.cjs.map +1 -1
  38. package/dist/cjs/lib/copy-button.d.cts +22 -4
  39. package/dist/cjs/lib/delete-domain-dialog.cjs +8 -7
  40. package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
  41. package/dist/cjs/lib/delete-user-dialog.cjs +15 -7
  42. package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
  43. package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
  44. package/dist/cjs/lib/domain-actions.cjs +8 -8
  45. package/dist/cjs/lib/domain-actions.cjs.map +1 -1
  46. package/dist/cjs/lib/edit-user-profile-dialog.cjs +10 -9
  47. package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
  48. package/dist/cjs/lib/edit-user-profile-dialog.d.cts +2 -2
  49. package/dist/cjs/lib/edit-user-role-dialog.cjs +15 -15
  50. package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
  51. package/dist/cjs/lib/edit-user-role-dialog.d.cts +2 -2
  52. package/dist/cjs/lib/elements/alert-dialog.cjs +76 -0
  53. package/dist/cjs/lib/elements/alert-dialog.cjs.map +1 -0
  54. package/dist/cjs/lib/elements/alert-dialog.d.cts +3 -0
  55. package/dist/cjs/lib/elements/dialog.cjs +74 -0
  56. package/dist/cjs/lib/elements/dialog.cjs.map +1 -0
  57. package/dist/cjs/lib/elements/dialog.d.cts +3 -0
  58. package/dist/cjs/lib/elements/dropdown-menu.cjs +162 -0
  59. package/dist/cjs/lib/elements/dropdown-menu.cjs.map +1 -0
  60. package/dist/cjs/lib/elements/dropdown-menu.d.cts +3 -0
  61. package/dist/cjs/lib/elements/select.cjs +112 -0
  62. package/dist/cjs/lib/elements/select.cjs.map +1 -0
  63. package/dist/cjs/lib/elements/select.d.cts +4 -0
  64. package/dist/cjs/lib/elements/utils.cjs +54 -0
  65. package/dist/cjs/lib/elements/utils.cjs.map +1 -0
  66. package/dist/cjs/lib/elements/utils.d.cts +15 -0
  67. package/dist/cjs/lib/elements.cjs +73 -219
  68. package/dist/cjs/lib/elements.cjs.map +1 -1
  69. package/dist/cjs/lib/elements.d.cts +16 -13
  70. package/dist/cjs/lib/elevated-access.cjs +18 -10
  71. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  72. package/dist/cjs/lib/empty-state.d.cts +12 -0
  73. package/dist/cjs/lib/invite-user-dialog.cjs +13 -12
  74. package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
  75. package/dist/cjs/lib/logout-all-sessions-dialog.cjs +7 -6
  76. package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
  77. package/dist/cjs/lib/logout-all-sessions-dialog.d.cts +2 -2
  78. package/dist/cjs/lib/logout-dialog.cjs +7 -6
  79. package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
  80. package/dist/cjs/lib/logout-dialog.d.cts +2 -2
  81. package/dist/cjs/lib/organization-switcher.cjs +39 -20
  82. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  83. package/dist/cjs/lib/organization-switcher.d.cts +16 -2
  84. package/dist/cjs/lib/otp-input.d.cts +8 -0
  85. package/dist/cjs/lib/pipes.cjs +51 -60
  86. package/dist/cjs/lib/pipes.cjs.map +1 -1
  87. package/dist/cjs/lib/pipes.d.cts +12 -0
  88. package/dist/cjs/lib/resend-invite-dialog.cjs +23 -13
  89. package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
  90. package/dist/cjs/lib/resend-invite-dialog.d.cts +2 -2
  91. package/dist/cjs/lib/reset-mfa-dialog.cjs +9 -8
  92. package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
  93. package/dist/cjs/lib/reset-mfa-dialog.d.cts +2 -2
  94. package/dist/cjs/lib/revoke-invite-dialog.cjs +17 -8
  95. package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
  96. package/dist/cjs/lib/revoke-invite-dialog.d.cts +2 -2
  97. package/dist/cjs/lib/save-button.cjs +3 -2
  98. package/dist/cjs/lib/save-button.cjs.map +1 -1
  99. package/dist/cjs/lib/save-button.d.cts +12 -1
  100. package/dist/cjs/lib/set-password-dialog.cjs +11 -9
  101. package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
  102. package/dist/cjs/lib/set-password-dialog.d.cts +2 -2
  103. package/dist/cjs/lib/user-actions-dropdown.cjs +9 -8
  104. package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
  105. package/dist/cjs/lib/user-profile.cjs +1 -1
  106. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  107. package/dist/cjs/lib/user-profile.d.cts +11 -0
  108. package/dist/cjs/lib/user-security.cjs +3 -3
  109. package/dist/cjs/lib/user-security.cjs.map +1 -1
  110. package/dist/cjs/lib/user-security.d.cts +12 -0
  111. package/dist/cjs/lib/user-sessions.cjs +3 -11
  112. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  113. package/dist/cjs/lib/user-sessions.d.cts +12 -0
  114. package/dist/cjs/lib/users-filter.cjs +5 -6
  115. package/dist/cjs/lib/users-filter.cjs.map +1 -1
  116. package/dist/cjs/lib/users-filter.d.cts +2 -2
  117. package/dist/cjs/lib/users-management.cjs +22 -34
  118. package/dist/cjs/lib/users-management.cjs.map +1 -1
  119. package/dist/cjs/lib/users-management.d.cts +11 -0
  120. package/dist/cjs/lib/users-search.cjs +2 -6
  121. package/dist/cjs/lib/users-search.cjs.map +1 -1
  122. package/dist/cjs/lib/utils.cjs +25 -2
  123. package/dist/cjs/lib/utils.cjs.map +1 -1
  124. package/dist/cjs/lib/utils.d.cts +17 -3
  125. package/dist/cjs/lib/view-dns-record-dialog.cjs +9 -8
  126. package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
  127. package/dist/cjs/lib/widgets-context.d.cts +8 -0
  128. package/dist/cjs/organization-switcher.client.cjs +33 -5
  129. package/dist/cjs/organization-switcher.client.cjs.map +1 -1
  130. package/dist/cjs/organization-switcher.client.d.cts +11 -0
  131. package/dist/cjs/pipes.client.d.cts +11 -0
  132. package/dist/cjs/select-KR89Qnvm.d.cts +30 -0
  133. package/dist/cjs/user-profile.client.d.cts +11 -0
  134. package/dist/cjs/user-security.client.d.cts +11 -0
  135. package/dist/cjs/user-sessions.client.d.cts +11 -0
  136. package/dist/cjs/users-management.client.d.cts +11 -0
  137. package/dist/cjs/workos-widgets.client.d.cts +8 -0
  138. package/dist/css/lib/provider-icon.css +6 -0
  139. package/dist/esm/admin-portal-domain-verification.client.d.ts +11 -0
  140. package/dist/esm/admin-portal-sso-connection.client.d.ts +11 -0
  141. package/dist/esm/alert-dialog-BlG3_awx.d.ts +25 -0
  142. package/dist/esm/api-keys.client.d.ts +11 -0
  143. package/dist/esm/dialog-C15qCLN3.d.ts +23 -0
  144. package/dist/esm/dropdown-menu-BQ5LtvdR.d.ts +48 -0
  145. package/dist/esm/index.d.ts +8 -0
  146. package/dist/esm/lib/add-mfa-dialog.d.ts +2 -2
  147. package/dist/esm/lib/add-mfa-dialog.js +16 -9
  148. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  149. package/dist/esm/lib/admin-portal-domain-verification.d.ts +11 -0
  150. package/dist/esm/lib/admin-portal-domain-verification.js +6 -8
  151. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  152. package/dist/esm/lib/admin-portal-sso-connection.d.ts +11 -0
  153. package/dist/esm/lib/admin-portal-sso-connection.js +8 -9
  154. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  155. package/dist/esm/lib/api-keys/api-key-details-dialog.js +3 -3
  156. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  157. package/dist/esm/lib/api-keys/api-keys-search.js +2 -6
  158. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  159. package/dist/esm/lib/api-keys/api-keys-table.js +18 -32
  160. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  161. package/dist/esm/lib/api-keys/api-keys.d.ts +12 -0
  162. package/dist/esm/lib/api-keys/api-keys.js +2 -2
  163. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  164. package/dist/esm/lib/api-keys/create-api-key.js +17 -14
  165. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  166. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +4 -4
  167. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  168. package/dist/esm/lib/api-keys/skeleton-table.js +2 -1
  169. package/dist/esm/lib/api-keys/skeleton-table.js.map +1 -1
  170. package/dist/esm/lib/change-password-dialog.d.ts +2 -2
  171. package/dist/esm/lib/change-password-dialog.js +8 -12
  172. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  173. package/dist/esm/lib/copy-button.d.ts +22 -4
  174. package/dist/esm/lib/copy-button.js +49 -28
  175. package/dist/esm/lib/copy-button.js.map +1 -1
  176. package/dist/esm/lib/delete-domain-dialog.js +4 -3
  177. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  178. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  179. package/dist/esm/lib/delete-user-dialog.js +13 -15
  180. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  181. package/dist/esm/lib/domain-actions.js +4 -4
  182. package/dist/esm/lib/domain-actions.js.map +1 -1
  183. package/dist/esm/lib/edit-user-profile-dialog.d.ts +2 -2
  184. package/dist/esm/lib/edit-user-profile-dialog.js +7 -12
  185. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  186. package/dist/esm/lib/edit-user-role-dialog.d.ts +2 -2
  187. package/dist/esm/lib/edit-user-role-dialog.js +9 -19
  188. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  189. package/dist/esm/lib/elements/alert-dialog.d.ts +3 -0
  190. package/dist/esm/lib/elements/alert-dialog.js +45 -0
  191. package/dist/esm/lib/elements/alert-dialog.js.map +1 -0
  192. package/dist/esm/lib/elements/dialog.d.ts +3 -0
  193. package/dist/esm/lib/elements/dialog.js +43 -0
  194. package/dist/esm/lib/elements/dialog.js.map +1 -0
  195. package/dist/esm/lib/elements/dropdown-menu.d.ts +3 -0
  196. package/dist/esm/lib/elements/dropdown-menu.js +131 -0
  197. package/dist/esm/lib/elements/dropdown-menu.js.map +1 -0
  198. package/dist/esm/lib/elements/select.d.ts +4 -0
  199. package/dist/esm/lib/elements/select.js +77 -0
  200. package/dist/esm/lib/elements/select.js.map +1 -0
  201. package/dist/esm/lib/elements/utils.d.ts +15 -0
  202. package/dist/esm/lib/elements/utils.js +20 -0
  203. package/dist/esm/lib/elements/utils.js.map +1 -0
  204. package/dist/esm/lib/elements.d.ts +16 -13
  205. package/dist/esm/lib/elements.js +71 -215
  206. package/dist/esm/lib/elements.js.map +1 -1
  207. package/dist/esm/lib/elevated-access.js +14 -6
  208. package/dist/esm/lib/elevated-access.js.map +1 -1
  209. package/dist/esm/lib/empty-state.d.ts +12 -0
  210. package/dist/esm/lib/invite-user-dialog.js +10 -24
  211. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  212. package/dist/esm/lib/logout-all-sessions-dialog.d.ts +2 -2
  213. package/dist/esm/lib/logout-all-sessions-dialog.js +6 -9
  214. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  215. package/dist/esm/lib/logout-dialog.d.ts +2 -2
  216. package/dist/esm/lib/logout-dialog.js +6 -9
  217. package/dist/esm/lib/logout-dialog.js.map +1 -1
  218. package/dist/esm/lib/organization-switcher.d.ts +16 -2
  219. package/dist/esm/lib/organization-switcher.js +34 -13
  220. package/dist/esm/lib/organization-switcher.js.map +1 -1
  221. package/dist/esm/lib/otp-input.d.ts +8 -0
  222. package/dist/esm/lib/pipes.d.ts +12 -0
  223. package/dist/esm/lib/pipes.js +50 -68
  224. package/dist/esm/lib/pipes.js.map +1 -1
  225. package/dist/esm/lib/resend-invite-dialog.d.ts +2 -2
  226. package/dist/esm/lib/resend-invite-dialog.js +17 -20
  227. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  228. package/dist/esm/lib/reset-mfa-dialog.d.ts +2 -2
  229. package/dist/esm/lib/reset-mfa-dialog.js +6 -9
  230. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  231. package/dist/esm/lib/revoke-invite-dialog.d.ts +2 -2
  232. package/dist/esm/lib/revoke-invite-dialog.js +14 -15
  233. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  234. package/dist/esm/lib/save-button.d.ts +12 -1
  235. package/dist/esm/lib/save-button.js +4 -9
  236. package/dist/esm/lib/save-button.js.map +1 -1
  237. package/dist/esm/lib/set-password-dialog.d.ts +2 -2
  238. package/dist/esm/lib/set-password-dialog.js +8 -12
  239. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  240. package/dist/esm/lib/user-actions-dropdown.js +8 -11
  241. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  242. package/dist/esm/lib/user-profile.d.ts +11 -0
  243. package/dist/esm/lib/user-profile.js +2 -2
  244. package/dist/esm/lib/user-profile.js.map +1 -1
  245. package/dist/esm/lib/user-security.d.ts +12 -0
  246. package/dist/esm/lib/user-security.js +4 -4
  247. package/dist/esm/lib/user-security.js.map +1 -1
  248. package/dist/esm/lib/user-sessions.d.ts +12 -0
  249. package/dist/esm/lib/user-sessions.js +5 -13
  250. package/dist/esm/lib/user-sessions.js.map +1 -1
  251. package/dist/esm/lib/users-filter.d.ts +2 -2
  252. package/dist/esm/lib/users-filter.js +5 -6
  253. package/dist/esm/lib/users-filter.js.map +1 -1
  254. package/dist/esm/lib/users-management.d.ts +11 -0
  255. package/dist/esm/lib/users-management.js +23 -39
  256. package/dist/esm/lib/users-management.js.map +1 -1
  257. package/dist/esm/lib/users-search.js +2 -6
  258. package/dist/esm/lib/users-search.js.map +1 -1
  259. package/dist/esm/lib/utils.d.ts +17 -3
  260. package/dist/esm/lib/utils.js +24 -2
  261. package/dist/esm/lib/utils.js.map +1 -1
  262. package/dist/esm/lib/view-dns-record-dialog.js +7 -17
  263. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  264. package/dist/esm/lib/widgets-context.d.ts +8 -0
  265. package/dist/esm/organization-switcher.client.d.ts +11 -0
  266. package/dist/esm/organization-switcher.client.js +33 -5
  267. package/dist/esm/organization-switcher.client.js.map +1 -1
  268. package/dist/esm/pipes.client.d.ts +11 -0
  269. package/dist/esm/select-KR89Qnvm.d.ts +30 -0
  270. package/dist/esm/user-profile.client.d.ts +11 -0
  271. package/dist/esm/user-security.client.d.ts +11 -0
  272. package/dist/esm/user-sessions.client.d.ts +11 -0
  273. package/dist/esm/users-management.client.d.ts +11 -0
  274. package/dist/esm/workos-widgets.client.d.ts +8 -0
  275. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/create-api-key.tsx"],"sourcesContent":["import {\n Box,\n Button,\n Checkbox,\n Dialog,\n Flex,\n ScrollArea,\n Text,\n Callout,\n IconButton,\n} from \"@radix-ui/themes\";\nimport {\n Label,\n PrimaryButton,\n SecondaryButton,\n TextField,\n TextFieldSlot,\n} from \"../elements.js\";\nimport * as Form from \"@radix-ui/react-form\";\nimport {\n ExclamationTriangleIcon,\n InfoCircledIcon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport { CopyButton } from \"../copy-button.js\";\nimport * as React from \"react\";\nimport { pluralize } from \"../utils.js\";\nimport {\n useListOrganizationApiKeyPermissions,\n ListOrganizationApiKeyPermission,\n} from \"../../api/endpoint.js\";\nimport { useCreateApiKey } from \"../api/api-key.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\n\nexport function CreateApiKeyDialog() {\n const {\n state: { createDialogOpen, createdApiKey },\n dispatch,\n } = useApiKeysContext();\n\n return (\n <Dialog.Root\n open={createDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({ type: \"CLOSE_CREATE_DIALOG\" });\n }\n }}\n >\n {createdApiKey ? (\n <SaveApiKeyContent apiKey={createdApiKey.value} />\n ) : (\n <CreateApiKeyForm\n // always remount the form when the dialog is opened to reset the validation errors\n key={`${createDialogOpen}`}\n />\n )}\n </Dialog.Root>\n );\n}\n\nfunction CreateApiKeyForm() {\n const { dispatch } = useApiKeysContext();\n const [errors, setErrors] = React.useState<{\n name: boolean;\n }>({ name: false });\n\n const validate = (formData: FormData) => {\n const name = formData.get(\"name\")?.toString() ?? \"\";\n const errors = { name: !name.trim().length };\n setErrors(errors);\n const isValid = Object.values(errors).every((error) => error === false);\n return isValid;\n };\n\n const {\n mutate: createOrganizationApiKey,\n error,\n isPending,\n isSuccess,\n } = useCreateApiKey();\n const permissions = useListOrganizationApiKeyPermissions({ limit: 100 });\n\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Create API key\n </Dialog.Title>\n <Form.Root\n onSubmit={(e) => {\n if (isPending) return;\n e.preventDefault();\n const data = new FormData(e.currentTarget);\n const isValid = validate(data);\n if (!isValid) {\n return;\n }\n\n createOrganizationApiKey(\n {\n data: {\n name: data.get(\"name\")?.toString() ?? \"\",\n permissions: data.getAll(\"permission\").map(String) || [],\n },\n },\n {\n onSuccess: (data) => {\n dispatch({ type: \"SET_CREATED_API_KEY\", apiKey: data });\n },\n },\n );\n }}\n >\n <Flex direction=\"column\" align=\"stretch\" gap=\"4\">\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while creating the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <Form.Field name=\"name\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"2\">\n <Form.Label asChild>\n <Label>Name</Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"off\"\n placeholder=\"A descriptive name for the API key\"\n />\n </Form.Control>\n {errors.name && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n The name is required\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n {permissions.isSuccess && permissions.data.data.length > 0 && (\n <PermissionsField permissions={permissions.data.data} />\n )}\n </Flex>\n\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <SecondaryButton disabled={isPending || isSuccess}>\n Cancel\n </SecondaryButton>\n </Dialog.Close>\n\n <PrimaryButton loading={isPending || isSuccess}>\n Create API key\n </PrimaryButton>\n </Flex>\n </Form.Root>\n </Dialog.Content>\n );\n}\n\nfunction SaveApiKeyContent({ apiKey }: { apiKey: string }) {\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Save your key\n </Dialog.Title>\n <Dialog.Description size=\"2\">\n Please save this API key in a secure location. If you lose it,\n you&apos;ll need to generate a new one.\n </Dialog.Description>\n <Callout.Root mt=\"5\" mb=\"4\">\n <Callout.Icon>\n <InfoCircledIcon />\n </Callout.Icon>\n <Callout.Text>\n You won&apos;t be able to access the key again. Please copy it now.\n </Callout.Text>\n </Callout.Root>\n <TextField value={apiKey} readOnly>\n <TextFieldSlot side=\"right\">\n <CopyButton asChild value={apiKey}>\n <IconButton variant=\"ghost\" size=\"1\" color=\"gray\" />\n </CopyButton>\n </TextFieldSlot>\n </TextField>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <CopyButton asChild value={apiKey} withIcon={false}>\n <PrimaryButton>Copy and close</PrimaryButton>\n </CopyButton>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n );\n}\n\nfunction Permission({\n checked,\n permission,\n onChange,\n}: {\n checked: boolean;\n permission: ListOrganizationApiKeyPermission;\n onChange: (isChecked: boolean) => void;\n}) {\n return (\n <label\n htmlFor={permission.slug}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"var(--space-2) var(--space-4)\",\n gap: \"var(--space-3)\",\n borderBottom: \"1px solid var(--gray-6)\",\n cursor: \"pointer\",\n }}\n >\n <Checkbox\n checked={checked}\n id={permission.slug}\n name=\"permission\"\n value={permission.slug}\n onCheckedChange={(e) => onChange(e === \"indeterminate\" ? false : e)}\n />\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n </Flex>\n </label>\n );\n}\n\nfunction PermissionsField({\n permissions = [],\n}: {\n permissions: ListOrganizationApiKeyPermission[];\n}) {\n const [selectedPermissions, setSelectedPermissions] = React.useState<\n ListOrganizationApiKeyPermission[]\n >([]);\n const [filter, setFilter] = React.useState(\"\");\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const filteredPermissions = React.useMemo(() => {\n return permissions.filter((p) => {\n return (\n !filter.trim().length ||\n p.description?.toLowerCase().match(filter.toLowerCase()) ||\n p.name.toLowerCase().match(filter.toLowerCase()) ||\n p.slug.toLowerCase().match(filter.toLowerCase())\n );\n });\n }, [permissions, filter]);\n\n React.useEffect(() => {\n const onResize = () => {\n if (fieldRef.current && filteredPermissions.length !== 0) {\n fieldRef.current.style.minHeight = \"unset\";\n }\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n }, [filteredPermissions.length]);\n\n return (\n <Form.Field name=\"permissions\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"1\">\n <Form.Label asChild>\n <Label>Permissions</Label>\n </Form.Label>\n <Text size=\"2\" mb=\"2\" color=\"gray\">\n Only enable the minimum permissions required for your use case.\n </Text>\n <Flex\n ref={fieldRef}\n style={{\n borderRadius: \"var(--radius-3)\",\n borderColor: \"var(--gray-6)\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n }}\n direction=\"column\"\n align=\"stretch\"\n >\n <TextField\n name=\"search\"\n value={filter}\n size=\"2\"\n onChange={(e) => {\n if (fieldRef.current) {\n fieldRef.current.style.minHeight =\n fieldRef.current.clientHeight + 2 + \"px\";\n }\n setFilter(e.target.value);\n }}\n style={{\n height: \"40px\",\n borderRadius: \"var(--radius-3) var(--radius-3) 0 0\",\n boxShadow: \"none\",\n }}\n placeholder=\"Search\"\n >\n <TextFieldSlot side=\"left\" px=\"3\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n {filteredPermissions.length > 0 ? (\n <>\n <ScrollArea\n scrollbars=\"vertical\"\n style={{\n flex: 1,\n maxHeight: \"calc(50vh - 150px)\",\n border: \"1px solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n {filteredPermissions.map((permission) => (\n <Permission\n checked={selectedPermissions.some(\n (sp) => sp.slug === permission.slug,\n )}\n key={permission.slug}\n permission={permission}\n onChange={(isChecked) =>\n setSelectedPermissions((prev) =>\n isChecked\n ? [...prev, permission]\n : prev.filter((sp) => sp.slug !== permission.slug),\n )\n }\n />\n ))}\n </ScrollArea>\n <Box\n px=\"4\"\n py=\"3\"\n mt={\"-1px\"}\n flexGrow=\"0\"\n style={{\n borderTop: \"0 solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n <SelectedPermissions\n total={permissions.length}\n selected={selectedPermissions.length}\n onToggle={() =>\n setSelectedPermissions((prev) =>\n prev.length === permissions.length ? [] : permissions,\n )\n }\n />\n </Box>\n </>\n ) : (\n <Flex\n gap=\"4\"\n pt=\"6\"\n pb=\"6\"\n style={{ borderTop: \"1px solid var(--gray-6)\" }}\n flexGrow=\"1\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n >\n <MagnifyingGlassIcon\n style={{\n color: \"var(--gray-9)\",\n width: \"var(--space-5)\",\n height: \"var(--space-5)\",\n }}\n />\n <Text size=\"2\" align=\"center\" mb=\"2\" wrap=\"balance\" weight=\"bold\">\n No permissions match your search\n </Text>\n <Button\n size=\"1\"\n color=\"gray\"\n variant=\"outline\"\n onClick={() => setFilter(\"\")}\n >\n Clear search\n </Button>\n </Flex>\n )}\n </Flex>\n </Flex>\n </Form.Field>\n );\n}\n\nfunction SelectedPermissions({\n total,\n selected,\n onToggle,\n}: {\n total: number;\n selected: number;\n onToggle: () => void;\n}) {\n return (\n <Flex align=\"center\" gap=\"2\">\n <Text size=\"1\" style={{ lineHeight: 1, color: \"var(--gray-11)\" }}>\n {selected === 0\n ? \"No permissions selected\"\n : `${pluralize(\"permission\", selected)} selected`}\n </Text>\n <Text\n size=\"1\"\n onClick={onToggle}\n style={{ cursor: \"pointer\", color: \"var(--accent-10)\" }}\n >\n {total === selected ? \"Deselect all\" : \"Select all\"}\n </Text>\n </Flex>\n );\n}\n\nexport function CreateApiKeyButton() {\n const { dispatch } = useApiKeysContext();\n return (\n <Button onClick={() => dispatch({ type: \"OPEN_CREATE_DIALOG\" })}>\n Create API key\n </Button>\n );\n}\n"],"mappings":"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","names":["errors","error","data"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/create-api-key.tsx"],"sourcesContent":["import {\n Box,\n Checkbox,\n Flex,\n ScrollArea,\n Text,\n Callout,\n} from \"@radix-ui/themes\";\nimport {\n Dialog,\n Label,\n Button,\n TextField,\n TextFieldSlot,\n} from \"../elements.js\";\nimport * as Form from \"@radix-ui/react-form\";\nimport {\n ExclamationTriangleIcon,\n InfoCircledIcon,\n MagnifyingGlassIcon,\n} from \"@radix-ui/react-icons\";\nimport { CopyButton, CopyIconButton } from \"../copy-button.js\";\nimport * as React from \"react\";\nimport { pluralize } from \"../utils.js\";\nimport {\n useListOrganizationApiKeyPermissions,\n ListOrganizationApiKeyPermission,\n} from \"../../api/endpoint.js\";\nimport { useCreateApiKey } from \"../api/api-key.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\n\nexport function CreateApiKeyDialog() {\n const {\n state: { createDialogOpen, createdApiKey },\n dispatch,\n } = useApiKeysContext();\n\n return (\n <Dialog.Root\n open={createDialogOpen}\n onOpenChange={(open) => {\n if (!open) {\n dispatch({ type: \"CLOSE_CREATE_DIALOG\" });\n }\n }}\n >\n {createdApiKey ? (\n <SaveApiKeyContent apiKey={createdApiKey.value} />\n ) : (\n <CreateApiKeyForm\n // always remount the form when the dialog is opened to reset the validation errors\n key={`${createDialogOpen}`}\n />\n )}\n </Dialog.Root>\n );\n}\n\nfunction CreateApiKeyForm() {\n const { dispatch } = useApiKeysContext();\n const [errors, setErrors] = React.useState<{\n name: boolean;\n }>({ name: false });\n\n const validate = (formData: FormData) => {\n const name = formData.get(\"name\")?.toString() ?? \"\";\n const errors = { name: !name.trim().length };\n setErrors(errors);\n const isValid = Object.values(errors).every((error) => error === false);\n return isValid;\n };\n\n const {\n mutate: createOrganizationApiKey,\n error,\n isPending,\n isSuccess,\n } = useCreateApiKey();\n const permissions = useListOrganizationApiKeyPermissions({ limit: 100 });\n\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Create API key\n </Dialog.Title>\n <Form.Root\n onSubmit={(e) => {\n if (isPending) return;\n e.preventDefault();\n const data = new FormData(e.currentTarget);\n const isValid = validate(data);\n if (!isValid) {\n return;\n }\n\n createOrganizationApiKey(\n {\n data: {\n name: data.get(\"name\")?.toString() ?? \"\",\n permissions: data.getAll(\"permission\").map(String) || [],\n },\n },\n {\n onSuccess: (data) => {\n dispatch({ type: \"SET_CREATED_API_KEY\", apiKey: data });\n },\n },\n );\n }}\n >\n <Flex direction=\"column\" align=\"stretch\" gap=\"4\">\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while creating the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <Form.Field name=\"name\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"2\">\n <Form.Label asChild>\n <Label>Name</Label>\n </Form.Label>\n <Form.Control asChild>\n <TextField\n data-1p-ignore\n autoComplete=\"off\"\n placeholder=\"A descriptive name for the API key\"\n />\n </Form.Control>\n {errors.name && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n The name is required\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n {permissions.isSuccess && permissions.data.data.length > 0 && (\n <PermissionsField permissions={permissions.data.data} />\n )}\n </Flex>\n\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={isPending || isSuccess}>\n Cancel\n </Button>\n </Dialog.Close>\n <Button type=\"submit\" loading={isPending || isSuccess}>\n Create API key\n </Button>\n </Flex>\n </Form.Root>\n </Dialog.Content>\n );\n}\n\nfunction SaveApiKeyContent({ apiKey }: { apiKey: string }) {\n return (\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title size=\"4\" weight={\"bold\"}>\n Save your key\n </Dialog.Title>\n <Dialog.Description size=\"2\">\n Please save this API key in a secure location. If you lose it,\n you&apos;ll need to generate a new one.\n </Dialog.Description>\n <Callout.Root mt=\"5\" mb=\"4\">\n <Callout.Icon>\n <InfoCircledIcon />\n </Callout.Icon>\n <Callout.Text>\n You won&apos;t be able to access the key again. Please copy it now.\n </Callout.Text>\n </Callout.Root>\n <TextField value={apiKey} readOnly>\n <TextFieldSlot side=\"right\">\n <CopyIconButton value={apiKey} />\n </TextFieldSlot>\n </TextField>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <CopyButton value={apiKey}>Copy and close</CopyButton>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n );\n}\n\nfunction Permission({\n checked,\n permission,\n onChange,\n}: {\n checked: boolean;\n permission: ListOrganizationApiKeyPermission;\n onChange: (isChecked: boolean) => void;\n}) {\n return (\n <label\n htmlFor={permission.slug}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"var(--space-2) var(--space-4)\",\n gap: \"var(--space-3)\",\n borderBottom: \"1px solid var(--gray-6)\",\n cursor: \"pointer\",\n }}\n >\n <Checkbox\n checked={checked}\n id={permission.slug}\n name=\"permission\"\n value={permission.slug}\n onCheckedChange={(e) => onChange(e === \"indeterminate\" ? false : e)}\n />\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n </Flex>\n </label>\n );\n}\n\nfunction PermissionsField({\n permissions = [],\n}: {\n permissions: ListOrganizationApiKeyPermission[];\n}) {\n const [selectedPermissions, setSelectedPermissions] = React.useState<\n ListOrganizationApiKeyPermission[]\n >([]);\n const [filter, setFilter] = React.useState(\"\");\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const filteredPermissions = React.useMemo(() => {\n return permissions.filter((p) => {\n return (\n !filter.trim().length ||\n p.description?.toLowerCase().match(filter.toLowerCase()) ||\n p.name.toLowerCase().match(filter.toLowerCase()) ||\n p.slug.toLowerCase().match(filter.toLowerCase())\n );\n });\n }, [permissions, filter]);\n\n React.useEffect(() => {\n const onResize = () => {\n if (fieldRef.current && filteredPermissions.length !== 0) {\n fieldRef.current.style.minHeight = \"unset\";\n }\n };\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"resize\", onResize);\n };\n }, [filteredPermissions.length]);\n\n return (\n <Form.Field name=\"permissions\" asChild>\n <Flex direction=\"column\" align=\"stretch\" gap=\"1\">\n <Form.Label asChild>\n <Label>Permissions</Label>\n </Form.Label>\n <Text size=\"2\" mb=\"2\" color=\"gray\">\n Only enable the minimum permissions required for your use case.\n </Text>\n <Flex\n ref={fieldRef}\n style={{\n borderRadius: \"var(--radius-3)\",\n borderColor: \"var(--gray-6)\",\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n }}\n direction=\"column\"\n align=\"stretch\"\n >\n <TextField\n name=\"search\"\n value={filter}\n size=\"2\"\n onChange={(e) => {\n if (fieldRef.current) {\n fieldRef.current.style.minHeight =\n fieldRef.current.clientHeight + 2 + \"px\";\n }\n setFilter(e.target.value);\n }}\n style={{\n height: \"40px\",\n borderRadius: \"var(--radius-3) var(--radius-3) 0 0\",\n boxShadow: \"none\",\n }}\n placeholder=\"Search\"\n >\n <TextFieldSlot side=\"left\" px=\"3\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n </TextField>\n {filteredPermissions.length > 0 ? (\n <>\n <ScrollArea\n scrollbars=\"vertical\"\n style={{\n flex: 1,\n maxHeight: \"calc(50vh - 150px)\",\n border: \"1px solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n {filteredPermissions.map((permission) => (\n <Permission\n checked={selectedPermissions.some(\n (sp) => sp.slug === permission.slug,\n )}\n key={permission.slug}\n permission={permission}\n onChange={(isChecked) =>\n setSelectedPermissions((prev) =>\n isChecked\n ? [...prev, permission]\n : prev.filter((sp) => sp.slug !== permission.slug),\n )\n }\n />\n ))}\n </ScrollArea>\n <Box\n px=\"4\"\n py=\"3\"\n mt={\"-1px\"}\n flexGrow=\"0\"\n style={{\n borderTop: \"0 solid var(--gray-6)\",\n borderWidth: \"1px 0 0\",\n }}\n >\n <SelectedPermissions\n total={permissions.length}\n selected={selectedPermissions.length}\n onToggle={() =>\n setSelectedPermissions((prev) =>\n prev.length === permissions.length ? [] : permissions,\n )\n }\n />\n </Box>\n </>\n ) : (\n <Flex\n gap=\"4\"\n pt=\"6\"\n pb=\"6\"\n style={{ borderTop: \"1px solid var(--gray-6)\" }}\n flexGrow=\"1\"\n justify=\"center\"\n align=\"center\"\n direction=\"column\"\n >\n <MagnifyingGlassIcon\n style={{\n color: \"var(--gray-9)\",\n width: \"var(--space-5)\",\n height: \"var(--space-5)\",\n }}\n />\n <Text size=\"2\" align=\"center\" mb=\"2\" wrap=\"balance\" weight=\"bold\">\n No permissions match your search\n </Text>\n <Button\n variant=\"secondary\"\n size=\"1\"\n onClick={() => setFilter(\"\")}\n >\n Clear search\n </Button>\n </Flex>\n )}\n </Flex>\n </Flex>\n </Form.Field>\n );\n}\n\nfunction SelectedPermissions({\n total,\n selected,\n onToggle,\n}: {\n total: number;\n selected: number;\n onToggle: () => void;\n}) {\n return (\n <Flex align=\"center\" gap=\"2\">\n <Text size=\"1\" style={{ lineHeight: 1, color: \"var(--gray-11)\" }}>\n {selected === 0\n ? \"No permissions selected\"\n : `${pluralize(\"permission\", selected)} selected`}\n </Text>\n <Text\n size=\"1\"\n onClick={onToggle}\n style={{ cursor: \"pointer\", color: \"var(--accent-10)\" }}\n >\n {total === selected ? \"Deselect all\" : \"Select all\"}\n </Text>\n </Flex>\n );\n}\n\nexport function CreateApiKeyButton() {\n const { dispatch } = useApiKeysContext();\n return (\n <Button\n variant=\"secondary\"\n onClick={() => dispatch({ type: \"OPEN_CREATE_DIALOG\" })}\n >\n Create API key\n </Button>\n );\n}\n"],"mappings":"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","names":["errors","error","data"]}
@@ -28,6 +28,7 @@ var import_endpoint = require("../../api/endpoint.js");
28
28
  var import_endpoint2 = require("../../api/endpoint.js");
29
29
  var import_react_query = require("@tanstack/react-query");
30
30
  var import_react_icons = require("@radix-ui/react-icons");
31
+ var import_elements = require("../elements.js");
31
32
  function RevokeApiKeyDialog({
32
33
  apiKey,
33
34
  open,
@@ -49,10 +50,10 @@ function RevokeApiKeyDialog({
49
50
  }
50
51
  }
51
52
  });
52
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Root, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.AlertDialog.Content, { maxWidth: "529px", children: [
53
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Title, { mb: "2", children: "Revoke API key?" }),
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Root, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Content, { maxWidth: "529px", children: [
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Title, { mb: "2", children: "Revoke API key?" }),
54
55
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "5", children: [
55
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.AlertDialog.Description, { size: "2", children: [
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Description, { size: "2", children: [
56
57
  "This API key will be immediately disabled. API request made using this key will be rejected, which could cause any systems still depending on it to break.",
57
58
  " ",
58
59
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "This action cannot be undone." })
@@ -63,14 +64,13 @@ function RevokeApiKeyDialog({
63
64
  ] }),
64
65
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_key_details_card.ApiKeyDetailsCard, { apiKey }),
65
66
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "end", gap: "2", children: [
66
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Button, { variant: "outline", color: "gray", children: "Cancel" }) }),
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: "Cancel" }) }),
67
68
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
- import_themes.Button,
69
+ import_elements.Button,
69
70
  {
71
+ variant: "destructive",
70
72
  disabled: isPending || isSuccess,
71
73
  loading: isPending || isSuccess,
72
- variant: "solid",
73
- color: "red",
74
74
  onClick: () => deleteOrganizationApiKey({ apiKeyId: apiKey.id }),
75
75
  children: "Revoke key"
76
76
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/revoke-api-key-dialog.tsx"],"sourcesContent":["import { Button, Flex, AlertDialog, Callout } from \"@radix-ui/themes\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n getListOrganizationApiKeysQueryKey,\n ListOrganizationApiKeysResponseData,\n} from \"../../api/endpoint.js\";\nimport { useDeleteOrganizationApiKey } from \"../../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ExclamationTriangleIcon } from \"@radix-ui/react-icons\";\n\nexport function RevokeApiKeyDialog({\n apiKey,\n open,\n onOpenChange,\n}: {\n apiKey: ListOrganizationApiKeysResponseData;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteOrganizationApiKey,\n isPending,\n error,\n isSuccess,\n } = useDeleteOrganizationApiKey({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationApiKeysQueryKey(),\n });\n onOpenChange(false);\n },\n },\n });\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content maxWidth=\"529px\">\n <AlertDialog.Title mb=\"2\">Revoke API key?</AlertDialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <AlertDialog.Description size=\"2\">\n This API key will be immediately disabled. API request made using\n this key will be rejected, which could cause any systems still\n depending on it to break.{\" \"}\n <strong>This action cannot be undone.</strong>\n </AlertDialog.Description>\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while revoking the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <ApiKeyDetailsCard apiKey={apiKey} />\n <Flex justify=\"end\" gap=\"2\">\n <AlertDialog.Cancel>\n <Button variant=\"outline\" color=\"gray\">\n Cancel\n </Button>\n </AlertDialog.Cancel>\n <Button\n disabled={isPending || isSuccess}\n loading={isPending || isSuccess}\n variant=\"solid\"\n color=\"red\"\n onClick={() => deleteOrganizationApiKey({ apiKeyId: apiKey.id })}\n >\n Revoke key\n </Button>\n </Flex>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCQ;AAvCR,oBAAmD;AACnD,kCAAkC;AAClC,sBAGO;AACP,IAAAA,mBAA4C;AAC5C,yBAA+B;AAC/B,yBAAwC;AAEjC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,kBAAc,mCAAe;AACnC,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAA4B;AAAA,IAC9B,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AACD,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,4CAAC,0BAAY,MAAZ,EAAiB,MAAY,cAC5B,uDAAC,0BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,0BAAY,OAAZ,EAAkB,IAAG,KAAI,6BAAe;AAAA,IACzC,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,mDAAC,0BAAY,aAAZ,EAAwB,MAAK,KAAI;AAAA;AAAA,QAGN;AAAA,QAC1B,4CAAC,YAAO,2CAA6B;AAAA,SACvC;AAAA,MACC,SACC,6CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,MAAK,SAC7B;AAAA,oDAAC,sBAAQ,MAAR,EACC,sDAAC,8CAAwB,GAC3B;AAAA,QACA,4CAAC,sBAAQ,MAAR,EAAa,2DAEd;AAAA,SACF;AAAA,MAEF,4CAAC,iDAAkB,QAAgB;AAAA,MACnC,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KACtB;AAAA,oDAAC,0BAAY,QAAZ,EACC,sDAAC,wBAAO,SAAQ,WAAU,OAAM,QAAO,oBAEvC,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,YACtB,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,MAAM,yBAAyB,EAAE,UAAU,OAAO,GAAG,CAAC;AAAA,YAChE;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["import_endpoint"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/revoke-api-key-dialog.tsx"],"sourcesContent":["import { Flex, Callout } from \"@radix-ui/themes\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n getListOrganizationApiKeysQueryKey,\n ListOrganizationApiKeysResponseData,\n} from \"../../api/endpoint.js\";\nimport { useDeleteOrganizationApiKey } from \"../../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ExclamationTriangleIcon } from \"@radix-ui/react-icons\";\nimport { AlertDialog, Button } from \"../elements.js\";\n\nexport function RevokeApiKeyDialog({\n apiKey,\n open,\n onOpenChange,\n}: {\n apiKey: ListOrganizationApiKeysResponseData;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const queryClient = useQueryClient();\n const {\n mutate: deleteOrganizationApiKey,\n isPending,\n error,\n isSuccess,\n } = useDeleteOrganizationApiKey({\n mutation: {\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: getListOrganizationApiKeysQueryKey(),\n });\n onOpenChange(false);\n },\n },\n });\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AlertDialog.Content maxWidth=\"529px\">\n <AlertDialog.Title mb=\"2\">Revoke API key?</AlertDialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <AlertDialog.Description size=\"2\">\n This API key will be immediately disabled. API request made using\n this key will be rejected, which could cause any systems still\n depending on it to break.{\" \"}\n <strong>This action cannot be undone.</strong>\n </AlertDialog.Description>\n {error && (\n <Callout.Root color=\"red\" role=\"alert\">\n <Callout.Icon>\n <ExclamationTriangleIcon />\n </Callout.Icon>\n <Callout.Text>\n An error occurred while revoking the API key.\n </Callout.Text>\n </Callout.Root>\n )}\n <ApiKeyDetailsCard apiKey={apiKey} />\n <Flex justify=\"end\" gap=\"2\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">Cancel</Button>\n </AlertDialog.Cancel>\n <Button\n variant=\"destructive\"\n disabled={isPending || isSuccess}\n loading={isPending || isSuccess}\n onClick={() => deleteOrganizationApiKey({ apiKeyId: apiKey.id })}\n >\n Revoke key\n </Button>\n </Flex>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCQ;AAxCR,oBAA8B;AAC9B,kCAAkC;AAClC,sBAGO;AACP,IAAAA,mBAA4C;AAC5C,yBAA+B;AAC/B,yBAAwC;AACxC,sBAAoC;AAE7B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,kBAAc,mCAAe;AACnC,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,8CAA4B;AAAA,IAC9B,UAAU;AAAA,MACR,WAAW,MAAM;AACf,oBAAY,kBAAkB;AAAA,UAC5B,cAAU,oDAAmC;AAAA,QAC/C,CAAC;AACD,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,4CAAC,4BAAY,MAAZ,EAAiB,MAAY,cAC5B,uDAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,4BAAY,OAAZ,EAAkB,IAAG,KAAI,6BAAe;AAAA,IACzC,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,mDAAC,4BAAY,aAAZ,EAAwB,MAAK,KAAI;AAAA;AAAA,QAGN;AAAA,QAC1B,4CAAC,YAAO,2CAA6B;AAAA,SACvC;AAAA,MACC,SACC,6CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,MAAK,SAC7B;AAAA,oDAAC,sBAAQ,MAAR,EACC,sDAAC,8CAAwB,GAC3B;AAAA,QACA,4CAAC,sBAAQ,MAAR,EAAa,2DAEd;AAAA,SACF;AAAA,MAEF,4CAAC,iDAAkB,QAAgB;AAAA,MACnC,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KACtB;AAAA,oDAAC,4BAAY,QAAZ,EACC,sDAAC,0BAAO,SAAQ,aAAY,oBAAM,GACpC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,UAAU,aAAa;AAAA,YACvB,SAAS,aAAa;AAAA,YACtB,SAAS,MAAM,yBAAyB,EAAE,UAAU,OAAO,GAAG,CAAC;AAAA,YAChE;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":["import_endpoint"]}
@@ -23,13 +23,14 @@ __export(skeleton_table_exports, {
23
23
  module.exports = __toCommonJS(skeleton_table_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_themes = require("@radix-ui/themes");
26
+ var import_elements = require("../elements.js");
26
27
  function SkeletonTable({
27
28
  numRows,
28
29
  columns
29
30
  }) {
30
31
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Root, { children: [
31
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Row, { children: columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: column.children }) }, index)) }) }),
32
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Body, { children: Array.from({ length: numRows }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Row, { children: columns.map((column, index2) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Skeleton, { children: column.children }) }, index2)) }, index)) })
32
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Row, { children: columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: column.children }) }, index)) }) }),
33
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Body, { children: Array.from({ length: numRows }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Row, { children: columns.map((column, index2) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: column.children }) }, index2)) }, index)) })
33
34
  ] });
34
35
  }
35
36
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/skeleton-table.tsx"],"sourcesContent":["import { Skeleton, Table } from \"@radix-ui/themes\";\n\nexport function SkeletonTable({\n numRows,\n columns,\n}: {\n numRows: number;\n columns: Table.ColumnHeaderCellProps[];\n}) {\n return (\n <Table.Root>\n <Table.Header>\n <Table.Row>\n {columns.map((column, index) => (\n <Table.ColumnHeaderCell key={index}>\n <Skeleton>{column.children}</Skeleton>\n </Table.ColumnHeaderCell>\n ))}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {Array.from({ length: numRows }).map((_, index) => (\n <Table.Row key={index}>\n {columns.map((column, index) => (\n <Table.Cell key={index}>\n <Skeleton>{column.children}</Skeleton>\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUI;AAVJ,oBAAgC;AAEzB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,SACE,6CAAC,oBAAM,MAAN,EACC;AAAA,gDAAC,oBAAM,QAAN,EACC,sDAAC,oBAAM,KAAN,EACE,kBAAQ,IAAI,CAAC,QAAQ,UACpB,4CAAC,oBAAM,kBAAN,EACC,sDAAC,0BAAU,iBAAO,UAAS,KADA,KAE7B,CACD,GACH,GACF;AAAA,IACA,4CAAC,oBAAM,MAAN,EACE,gBAAM,KAAK,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,UACvC,4CAAC,oBAAM,KAAN,EACE,kBAAQ,IAAI,CAAC,QAAQA,WACpB,4CAAC,oBAAM,MAAN,EACC,sDAAC,0BAAU,iBAAO,UAAS,KADZA,MAEjB,CACD,KALa,KAMhB,CACD,GACH;AAAA,KACF;AAEJ;","names":["index"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/skeleton-table.tsx"],"sourcesContent":["import { Table } from \"@radix-ui/themes\";\nimport { Skeleton } from \"../elements.js\";\n\nexport function SkeletonTable({\n numRows,\n columns,\n}: {\n numRows: number;\n columns: Table.ColumnHeaderCellProps[];\n}) {\n return (\n <Table.Root>\n <Table.Header>\n <Table.Row>\n {columns.map((column, index) => (\n <Table.ColumnHeaderCell key={index}>\n <Skeleton>{column.children}</Skeleton>\n </Table.ColumnHeaderCell>\n ))}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {Array.from({ length: numRows }).map((_, index) => (\n <Table.Row key={index}>\n {columns.map((column, index) => (\n <Table.Cell key={index}>\n <Skeleton>{column.children}</Skeleton>\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWI;AAXJ,oBAAsB;AACtB,sBAAyB;AAElB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,SACE,6CAAC,oBAAM,MAAN,EACC;AAAA,gDAAC,oBAAM,QAAN,EACC,sDAAC,oBAAM,KAAN,EACE,kBAAQ,IAAI,CAAC,QAAQ,UACpB,4CAAC,oBAAM,kBAAN,EACC,sDAAC,4BAAU,iBAAO,UAAS,KADA,KAE7B,CACD,GACH,GACF;AAAA,IACA,4CAAC,oBAAM,MAAN,EACE,gBAAM,KAAK,EAAE,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,UACvC,4CAAC,oBAAM,KAAN,EACE,kBAAQ,IAAI,CAAC,QAAQA,WACpB,4CAAC,oBAAM,MAAN,EACC,sDAAC,4BAAU,iBAAO,UAAS,KADZA,MAEjB,CACD,KALa,KAMhB,CACD,GACH;AAAA,KACF;AAEJ;","names":["index"]}
@@ -48,14 +48,14 @@ function ChangePasswordDialog({
48
48
  setOpen(false);
49
49
  }, []);
50
50
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51
- import_themes.Dialog.Root,
51
+ import_elements.Dialog.Root,
52
52
  {
53
53
  ...props,
54
54
  open: props.open || open,
55
55
  onOpenChange: props.onOpenChange || setOpen,
56
56
  children: [
57
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Dialog.Trigger, { children }),
58
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.DialogContent, { maxWidth: "480px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Content, { onClose: handleClose }) })
57
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Trigger, { children }),
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Content, { maxWidth: "480px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Content, { onClose: handleClose }) })
59
59
  ]
60
60
  }
61
61
  );
@@ -91,8 +91,8 @@ function Content({ onClose }) {
91
91
  });
92
92
  };
93
93
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
94
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Dialog.Title, { mb: "5", children: "Change Password" }),
95
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Dialog.Description, { children: "Change your account password" }) }),
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { mb: "5", children: "Change Password" }),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Description, { children: "Change your account password" }) }),
96
96
  errorMessage && errorMessage !== "Invalid credentials" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Root, { color: "red", my: "-2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Callout.Text, { children: errorMessage }) }) : null,
97
97
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
98
98
  Form.Root,
@@ -197,9 +197,10 @@ function Content({ onClose }) {
197
197
  )
198
198
  ] }),
199
199
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { mt: "5", gap: "3", justify: "end", children: [
200
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
201
- import_elements.SecondaryButton,
200
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
201
+ import_elements.Button,
202
202
  {
203
+ variant: "secondary",
203
204
  type: "button",
204
205
  disabled: changePassword.isPending || changePassword.isSuccess,
205
206
  children: "Cancel"
@@ -208,11 +209,12 @@ function Content({ onClose }) {
208
209
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
209
210
  import_save_button.SaveButton,
210
211
  {
211
- asChild: true,
212
+ type: "submit",
212
213
  loading: changePassword.isPending,
213
214
  done: changePassword.isSuccess,
214
215
  onDone: onClose,
215
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.PrimaryButton, { type: "submit", disabled: disableSubmit, children: "Change password" })
216
+ disabled: disableSubmit || void 0,
217
+ children: "Change password"
216
218
  }
217
219
  )
218
220
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/change-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Dialog, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as Form from \"@radix-ui/react-form\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport {\n DialogContent,\n Label,\n PasswordField,\n PrimaryButton,\n SecondaryButton,\n} from \"./elements.js\";\nimport { useUpdatePassword } from \"../api/endpoint.js\";\nimport { SaveButton } from \"./save-button.js\";\n\ninterface ChangePasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function ChangePasswordDialog({\n children,\n ...props\n}: ChangePasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open || open}\n onOpenChange={props.onOpenChange || setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <DialogContent maxWidth=\"480px\">\n <Content onClose={handleClose} />\n </DialogContent>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n onClose: () => void;\n}\n\nfunction Content({ onClose }: ContentProps) {\n const changePassword = useUpdatePassword({\n mutation: {\n onError: (error) => {\n const errorMsg = getMutationErrorMessage(error);\n if (errorMsg === \"Invalid credentials\") {\n setServerErrors({\n currentPassword:\n \"Your current password is incorrect. Please, try again.\",\n });\n }\n },\n },\n });\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n const [serverErrors, setServerErrors] = React.useState<{\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const errorMessage = React.useMemo(() => {\n if (changePassword.error) {\n return getMutationErrorMessage(changePassword.error);\n }\n\n return null;\n }, [changePassword.error]);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n\n changePassword.mutate({\n data: { currentPassword, newPassword },\n });\n };\n\n return (\n <>\n <Dialog.Title mb=\"5\">Change Password</Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>Change your account password</Dialog.Description>\n </VisuallyHidden>\n\n {errorMessage && errorMessage !== \"Invalid credentials\" ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{errorMessage}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={handleSubmit}\n onChange={(event) => {\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n const confirmPassword =\n formData.get(\"confirmPassword\")?.toString() ?? \"\";\n\n setDisableSubmit(\n currentPassword === \"\" ||\n newPassword === \"\" ||\n confirmPassword === \"\",\n );\n setServerErrors({});\n }}\n onClearServerErrors={() => {\n setServerErrors({});\n }}\n >\n <Flex mt=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field\n name=\"oldPassword\"\n asChild\n serverInvalid={!serverErrors.currentPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your current password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n autoComplete=\"current-password\"\n placeholder=\"Current password\"\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your current password\n </Text>\n </Form.Message>\n\n {serverErrors.currentPassword && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n {serverErrors.currentPassword}\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"password\"\n asChild\n serverInvalid={!serverErrors.password}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"New password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your new password\n </Text>\n </Form.Message>\n <Form.Message match={(value) => value.length < 8} asChild>\n <Text size=\"2\" color=\"red\">\n Password must be at least 8 characters\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) =>\n value === formData.get(\"oldPassword\")\n }\n asChild\n >\n <Text size=\"2\" color=\"red\">\n You cannot reuse your current password\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"confirmPassword\"\n asChild\n serverInvalid={!serverErrors.confirmPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Confirm your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"Confirm new password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please confirm your new password\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) => value !== formData.get(\"password\")}\n asChild\n >\n <Text size=\"2\" color=\"red\">\n The new passwords you entered don’t match.\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <SecondaryButton\n type=\"button\"\n disabled={changePassword.isPending || changePassword.isSuccess}\n >\n Cancel\n </SecondaryButton>\n </Dialog.Close>\n\n <SaveButton\n asChild\n loading={changePassword.isPending}\n done={changePassword.isSuccess}\n onDone={onClose}\n >\n <PrimaryButton type=\"submit\" disabled={disableSubmit}>\n Change password\n </PrimaryButton>\n </SaveButton>\n </Flex>\n </Form.Root>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{errorMessage}</section>\n </VisuallyHidden>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n return \"Something went wrong. Please try again.\";\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/change-password-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as Form from \"@radix-ui/react-form\";\nimport * as React from \"react\";\nimport { type ReactNode } from \"react\";\nimport { Button, Dialog, Label, PasswordField } from \"./elements.js\";\nimport { useUpdatePassword } from \"../api/endpoint.js\";\nimport { SaveButton } from \"./save-button.js\";\n\ninterface ChangePasswordDialogProps extends Dialog.RootProps {\n children?: ReactNode;\n}\n\nexport function ChangePasswordDialog({\n children,\n ...props\n}: ChangePasswordDialogProps) {\n const [open, setOpen] = React.useState(false);\n\n const handleClose = React.useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Dialog.Root\n {...props}\n open={props.open || open}\n onOpenChange={props.onOpenChange || setOpen}\n >\n <Dialog.Trigger>{children}</Dialog.Trigger>\n\n <Dialog.Content maxWidth=\"480px\">\n <Content onClose={handleClose} />\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface ContentProps {\n onClose: () => void;\n}\n\nfunction Content({ onClose }: ContentProps) {\n const changePassword = useUpdatePassword({\n mutation: {\n onError: (error) => {\n const errorMsg = getMutationErrorMessage(error);\n if (errorMsg === \"Invalid credentials\") {\n setServerErrors({\n currentPassword:\n \"Your current password is incorrect. Please, try again.\",\n });\n }\n },\n },\n });\n const [disableSubmit, setDisableSubmit] = React.useState(true);\n const [serverErrors, setServerErrors] = React.useState<{\n currentPassword?: string;\n password?: string;\n confirmPassword?: string;\n }>({});\n\n const errorMessage = React.useMemo(() => {\n if (changePassword.error) {\n return getMutationErrorMessage(changePassword.error);\n }\n\n return null;\n }, [changePassword.error]);\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n\n changePassword.mutate({\n data: { currentPassword, newPassword },\n });\n };\n\n return (\n <>\n <Dialog.Title mb=\"5\">Change Password</Dialog.Title>\n <VisuallyHidden>\n <Dialog.Description>Change your account password</Dialog.Description>\n </VisuallyHidden>\n\n {errorMessage && errorMessage !== \"Invalid credentials\" ? (\n <Callout.Root color=\"red\" my=\"-2\">\n <Callout.Text>{errorMessage}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Form.Root\n onSubmit={handleSubmit}\n onChange={(event) => {\n const formData = new FormData(event.currentTarget);\n const currentPassword = formData.get(\"oldPassword\")?.toString() ?? \"\";\n const newPassword = formData.get(\"password\")?.toString() ?? \"\";\n const confirmPassword =\n formData.get(\"confirmPassword\")?.toString() ?? \"\";\n\n setDisableSubmit(\n currentPassword === \"\" ||\n newPassword === \"\" ||\n confirmPassword === \"\",\n );\n setServerErrors({});\n }}\n onClearServerErrors={() => {\n setServerErrors({});\n }}\n >\n <Flex mt=\"5\" direction=\"column\" gap=\"4\">\n <Form.Field\n name=\"oldPassword\"\n asChild\n serverInvalid={!serverErrors.currentPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your current password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoFocus\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n autoComplete=\"current-password\"\n placeholder=\"Current password\"\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your current password\n </Text>\n </Form.Message>\n\n {serverErrors.currentPassword && (\n <Form.Message asChild>\n <Text size=\"2\" color=\"red\">\n {serverErrors.currentPassword}\n </Text>\n </Form.Message>\n )}\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"password\"\n asChild\n serverInvalid={!serverErrors.password}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Enter your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"New password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please enter your new password\n </Text>\n </Form.Message>\n <Form.Message match={(value) => value.length < 8} asChild>\n <Text size=\"2\" color=\"red\">\n Password must be at least 8 characters\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) =>\n value === formData.get(\"oldPassword\")\n }\n asChild\n >\n <Text size=\"2\" color=\"red\">\n You cannot reuse your current password\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n\n <Form.Field\n name=\"confirmPassword\"\n asChild\n serverInvalid={!serverErrors.confirmPassword}\n >\n <Flex direction=\"column\" gap=\"2\">\n <Form.Label asChild>\n <Label>Confirm your new password</Label>\n </Form.Label>\n\n <Form.Control asChild>\n <PasswordField\n autoComplete=\"new-password\"\n placeholder=\"Confirm new password\"\n required\n disabled={\n changePassword.isPending || changePassword.isSuccess\n }\n />\n </Form.Control>\n <Form.Message match=\"valueMissing\" asChild>\n <Text size=\"2\" color=\"red\">\n Please confirm your new password\n </Text>\n </Form.Message>\n <Form.Message\n match={(value, formData) => value !== formData.get(\"password\")}\n asChild\n >\n <Text size=\"2\" color=\"red\">\n The new passwords you entered don’t match.\n </Text>\n </Form.Message>\n </Flex>\n </Form.Field>\n </Flex>\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={changePassword.isPending || changePassword.isSuccess}\n >\n Cancel\n </Button>\n </Dialog.Close>\n\n <SaveButton\n type=\"submit\"\n loading={changePassword.isPending}\n done={changePassword.isSuccess}\n onDone={onClose}\n disabled={disableSubmit || undefined}\n >\n Change password\n </SaveButton>\n </Flex>\n </Form.Root>\n\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{errorMessage}</section>\n </VisuallyHidden>\n </>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return error.message;\n }\n\n return \"Something went wrong. Please try again.\";\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { Dialog } from '@radix-ui/themes';
3
2
  import { ReactNode } from 'react';
3
+ import { RootProps } from '@radix-ui/themes/components/dialog';
4
4
 
5
- interface ChangePasswordDialogProps extends Dialog.RootProps {
5
+ interface ChangePasswordDialogProps extends RootProps {
6
6
  children?: ReactNode;
7
7
  }
8
8
  declare function ChangePasswordDialog({ children, ...props }: ChangePasswordDialogProps): react_jsx_runtime.JSX.Element;
@@ -28,47 +28,69 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var copy_button_exports = {};
30
30
  __export(copy_button_exports, {
31
- CopyButton: () => CopyButton
31
+ CopyButton: () => CopyButton,
32
+ CopyIconButton: () => CopyIconButton
32
33
  });
33
34
  module.exports = __toCommonJS(copy_button_exports);
34
35
  var import_jsx_runtime = require("react/jsx-runtime");
35
36
  var React = __toESM(require("react"), 1);
37
+ var import_elements = require("./elements.js");
36
38
  var import_react_icons = require("@radix-ui/react-icons");
37
39
  var import_themes = require("@radix-ui/themes");
38
40
  const CopyButton = React.forwardRef(
39
- function CopyButton2({ value, asChild, children, style, withIcon = true, ...props }, ref) {
40
- const [hasCopied, setHasCopied] = React.useState(false);
41
- const Comp = asChild ? import_themes.Slot : "button";
42
- const timeoutRef = React.useRef(void 0);
43
- const handleClick = async () => {
44
- try {
45
- await navigator.clipboard.writeText(value);
46
- setHasCopied(true);
47
- if (timeoutRef.current) {
48
- window.clearTimeout(timeoutRef.current);
49
- }
50
- timeoutRef.current = window.setTimeout(() => {
51
- setHasCopied(false);
52
- }, 3e3);
53
- } catch (err) {
54
- console.error("Failed to copy text:", err);
55
- }
56
- };
57
- React.useEffect(() => {
58
- return () => {
59
- if (timeoutRef.current) {
60
- window.clearTimeout(timeoutRef.current);
61
- }
62
- };
63
- }, []);
64
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Comp, { onPointerUp: handleClick, ref, ...props, children: [
65
- withIcon && (hasCopied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CopyIcon, {})),
41
+ function CopyButton2({ value, asChild, children, style, withIcon = false, ...props }, ref) {
42
+ const Comp = asChild ? import_themes.Slot : import_elements.Button;
43
+ const [hasCopied, copy] = useCopy(value);
44
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Comp, { type: "button", onPointerUp: copy, ref, ...props, children: [
45
+ withIcon && (hasCopied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CheckIcon, { "aria-hidden": true }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CopyIcon, { "aria-hidden": true })),
66
46
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Slottable, { children })
67
47
  ] });
68
48
  }
69
49
  );
50
+ const CopyIconButton = React.forwardRef(function CopyIconButton2({ value, style, ...props }, ref) {
51
+ const [hasCopied, copy] = useCopy(value);
52
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
53
+ import_elements.IconButton,
54
+ {
55
+ type: "button",
56
+ onPointerUp: copy,
57
+ ref,
58
+ title: hasCopied ? "Copied" : "Copy to clipboard",
59
+ "aria-label": "Copy to clipboard",
60
+ ...props,
61
+ children: hasCopied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CheckIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.CopyIcon, {})
62
+ }
63
+ );
64
+ });
65
+ function useCopy(value) {
66
+ const [hasCopied, setHasCopied] = React.useState(false);
67
+ const timeoutRef = React.useRef(void 0);
68
+ const copy = async () => {
69
+ try {
70
+ await navigator.clipboard.writeText(value);
71
+ setHasCopied(true);
72
+ if (timeoutRef.current) {
73
+ window.clearTimeout(timeoutRef.current);
74
+ }
75
+ timeoutRef.current = window.setTimeout(() => {
76
+ setHasCopied(false);
77
+ }, 3e3);
78
+ } catch (err) {
79
+ console.error("Failed to copy text:", err);
80
+ }
81
+ };
82
+ React.useEffect(() => {
83
+ return () => {
84
+ if (timeoutRef.current) {
85
+ window.clearTimeout(timeoutRef.current);
86
+ }
87
+ };
88
+ }, []);
89
+ return [hasCopied, copy];
90
+ }
70
91
  // Annotate the CommonJS export names for ESM import in node:
71
92
  0 && (module.exports = {
72
- CopyButton
93
+ CopyButton,
94
+ CopyIconButton
73
95
  });
74
96
  //# sourceMappingURL=copy-button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/copy-button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { CheckIcon, CopyIcon } from \"@radix-ui/react-icons\";\nimport { Slot, Slottable } from \"@radix-ui/themes\";\n\ninterface CopyButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string;\n withIcon?: boolean;\n asChild?: boolean;\n}\n\nexport const CopyButton = React.forwardRef<HTMLButtonElement, CopyButtonProps>(\n function CopyButton(\n { value, asChild, children, style, withIcon = true, ...props },\n ref,\n ) {\n const [hasCopied, setHasCopied] = React.useState(false);\n const Comp = asChild ? Slot : \"button\";\n const timeoutRef = React.useRef<number | undefined>(undefined);\n\n const handleClick = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setHasCopied(true);\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = window.setTimeout(() => {\n setHasCopied(false);\n }, 3000);\n } catch (err) {\n console.error(\"Failed to copy text:\", err);\n }\n };\n\n // Cleanup timeout on unmount\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return (\n <Comp onPointerUp={handleClick} ref={ref} {...props}>\n {withIcon && (hasCopied ? <CheckIcon /> : <CopyIcon />)}\n <Slottable>{children}</Slottable>\n </Comp>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDM;AAjDN,YAAuB;AACvB,yBAAoC;AACpC,oBAAgC;AASzB,MAAM,aAAa,MAAM;AAAA,EAC9B,SAASA,YACP,EAAE,OAAO,SAAS,UAAU,OAAO,WAAW,MAAM,GAAG,MAAM,GAC7D,KACA;AACA,UAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,UAAM,OAAO,UAAU,qBAAO;AAC9B,UAAM,aAAa,MAAM,OAA2B,MAAS;AAE7D,UAAM,cAAc,YAAY;AAC9B,UAAI;AACF,cAAM,UAAU,UAAU,UAAU,KAAK;AACzC,qBAAa,IAAI;AAGjB,YAAI,WAAW,SAAS;AACtB,iBAAO,aAAa,WAAW,OAAO;AAAA,QACxC;AAGA,mBAAW,UAAU,OAAO,WAAW,MAAM;AAC3C,uBAAa,KAAK;AAAA,QACpB,GAAG,GAAI;AAAA,MACT,SAAS,KAAK;AACZ,gBAAQ,MAAM,wBAAwB,GAAG;AAAA,MAC3C;AAAA,IACF;AAGA,UAAM,UAAU,MAAM;AACpB,aAAO,MAAM;AACX,YAAI,WAAW,SAAS;AACtB,iBAAO,aAAa,WAAW,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,WACE,6CAAC,QAAK,aAAa,aAAa,KAAW,GAAG,OAC3C;AAAA,mBAAa,YAAY,4CAAC,gCAAU,IAAK,4CAAC,+BAAS;AAAA,MACpD,4CAAC,2BAAW,UAAS;AAAA,OACvB;AAAA,EAEJ;AACF;","names":["CopyButton"]}
1
+ {"version":3,"sources":["../../../src/lib/copy-button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { IconButton, Button } from \"./elements.js\";\nimport { CheckIcon, CopyIcon } from \"@radix-ui/react-icons\";\nimport { Slot, Slottable } from \"@radix-ui/themes\";\n\ninterface CopyButtonOwnProps {\n value: string;\n withIcon?: boolean;\n}\n\ninterface CopyButtonProps\n extends CopyButtonOwnProps,\n Omit<React.ComponentProps<typeof Button>, keyof CopyButtonOwnProps> {}\n\nexport const CopyButton = React.forwardRef<HTMLButtonElement, CopyButtonProps>(\n function CopyButton(\n { value, asChild, children, style, withIcon = false, ...props },\n ref,\n ) {\n const Comp = asChild ? Slot : Button;\n const [hasCopied, copy] = useCopy(value);\n return (\n <Comp type=\"button\" onPointerUp={copy} ref={ref} {...props}>\n {withIcon &&\n (hasCopied ? <CheckIcon aria-hidden /> : <CopyIcon aria-hidden />)}\n <Slottable>{children}</Slottable>\n </Comp>\n );\n },\n);\n\ninterface CopyIconButtonOwnProps {\n value: string;\n}\n\ninterface CopyIconButtonProps\n extends CopyIconButtonOwnProps,\n Omit<\n React.ComponentProps<typeof IconButton>,\n \"asChild\" | \"children\" | keyof CopyIconButtonOwnProps\n > {}\n\nexport const CopyIconButton = React.forwardRef<\n HTMLButtonElement,\n CopyIconButtonProps\n>(function CopyIconButton({ value, style, ...props }, ref) {\n const [hasCopied, copy] = useCopy(value);\n return (\n <IconButton\n type=\"button\"\n onPointerUp={copy}\n ref={ref}\n title={hasCopied ? \"Copied\" : \"Copy to clipboard\"}\n aria-label=\"Copy to clipboard\"\n {...props}\n >\n {hasCopied ? <CheckIcon /> : <CopyIcon />}\n </IconButton>\n );\n});\n\nfunction useCopy(value: string) {\n const [hasCopied, setHasCopied] = React.useState(false);\n const timeoutRef = React.useRef<number | undefined>(undefined);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setHasCopied(true);\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = window.setTimeout(() => {\n setHasCopied(false);\n }, 3000);\n } catch (err) {\n console.error(\"Failed to copy text:\", err);\n }\n };\n\n // Cleanup timeout on unmount\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return [hasCopied, copy] as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBM;AAtBN,YAAuB;AACvB,sBAAmC;AACnC,yBAAoC;AACpC,oBAAgC;AAWzB,MAAM,aAAa,MAAM;AAAA,EAC9B,SAASA,YACP,EAAE,OAAO,SAAS,UAAU,OAAO,WAAW,OAAO,GAAG,MAAM,GAC9D,KACA;AACA,UAAM,OAAO,UAAU,qBAAO;AAC9B,UAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,WACE,6CAAC,QAAK,MAAK,UAAS,aAAa,MAAM,KAAW,GAAG,OAClD;AAAA,mBACE,YAAY,4CAAC,gCAAU,eAAW,MAAC,IAAK,4CAAC,+BAAS,eAAW,MAAC;AAAA,MACjE,4CAAC,2BAAW,UAAS;AAAA,OACvB;AAAA,EAEJ;AACF;AAaO,MAAM,iBAAiB,MAAM,WAGlC,SAASC,gBAAe,EAAE,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK;AACzD,QAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb;AAAA,MACA,OAAO,YAAY,WAAW;AAAA,MAC9B,cAAW;AAAA,MACV,GAAG;AAAA,MAEH,sBAAY,4CAAC,gCAAU,IAAK,4CAAC,+BAAS;AAAA;AAAA,EACzC;AAEJ,CAAC;AAED,SAAS,QAAQ,OAAe;AAC9B,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,aAAa,MAAM,OAA2B,MAAS;AAE7D,QAAM,OAAO,YAAY;AACvB,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,KAAK;AACzC,mBAAa,IAAI;AAGjB,UAAI,WAAW,SAAS;AACtB,eAAO,aAAa,WAAW,OAAO;AAAA,MACxC;AAGA,iBAAW,UAAU,OAAO,WAAW,MAAM;AAC3C,qBAAa,KAAK;AAAA,MACpB,GAAG,GAAI;AAAA,IACT,SAAS,KAAK;AACZ,cAAQ,MAAM,wBAAwB,GAAG;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,eAAO,aAAa,WAAW,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,WAAW,IAAI;AACzB;","names":["CopyButton","CopyIconButton"]}
@@ -1,10 +1,28 @@
1
1
  import * as React from 'react';
2
+ import { Button, IconButton } from './elements.cjs';
3
+ import '@radix-ui/themes';
4
+ import '@radix-ui/themes/props';
5
+ import '../dialog-C15qCLN3.cjs';
6
+ import '@radix-ui/themes/components/dialog';
7
+ import '../alert-dialog-BlG3_awx.cjs';
8
+ import '@radix-ui/themes/components/alert-dialog';
9
+ import '../dropdown-menu-BQ5LtvdR.cjs';
10
+ import '@radix-ui/themes/components/dropdown-menu';
11
+ import '../select-KR89Qnvm.cjs';
12
+ import '@radix-ui/themes/components/select';
2
13
 
3
- interface CopyButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
14
+ interface CopyButtonOwnProps {
4
15
  value: string;
5
16
  withIcon?: boolean;
6
- asChild?: boolean;
7
17
  }
8
- declare const CopyButton: React.ForwardRefExoticComponent<CopyButtonProps & React.RefAttributes<HTMLButtonElement>>;
18
+ interface CopyButtonProps extends CopyButtonOwnProps, Omit<React.ComponentProps<typeof Button>, keyof CopyButtonOwnProps> {
19
+ }
20
+ declare const CopyButton: React.ForwardRefExoticComponent<Omit<CopyButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
21
+ interface CopyIconButtonOwnProps {
22
+ value: string;
23
+ }
24
+ interface CopyIconButtonProps extends CopyIconButtonOwnProps, Omit<React.ComponentProps<typeof IconButton>, "asChild" | "children" | keyof CopyIconButtonOwnProps> {
25
+ }
26
+ declare const CopyIconButton: React.ForwardRefExoticComponent<Omit<CopyIconButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
9
27
 
10
- export { CopyButton };
28
+ export { CopyButton, CopyIconButton };
@@ -24,6 +24,7 @@ __export(delete_domain_dialog_exports, {
24
24
  module.exports = __toCommonJS(delete_domain_dialog_exports);
25
25
  var import_jsx_runtime = require("react/jsx-runtime");
26
26
  var import_themes = require("@radix-ui/themes");
27
+ var import_elements = require("./elements.js");
27
28
  const DeleteDomainDialog = (props) => {
28
29
  const message = (() => {
29
30
  switch (props.domain.state) {
@@ -53,14 +54,14 @@ const DeleteDomainDialog = (props) => {
53
54
  props.onDeleteDomain(props.domain.id);
54
55
  props.onOpenChange(false);
55
56
  };
56
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.AlertDialog.Root, { open: props.open, onOpenChange: props.onOpenChange, children: [
57
- props.children && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Trigger, { children: props.children }),
58
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.AlertDialog.Content, { style: { maxWidth: "488px" }, children: [
59
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Title, { mb: "2", children: "Remove domain" }),
60
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", highContrast: true, children: message }) }),
57
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Root, { open: props.open, onOpenChange: props.onOpenChange, children: [
58
+ props.children && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Trigger, { children: props.children }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Content, { style: { maxWidth: "488px" }, children: [
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Title, { mb: "2", children: "Remove domain" }),
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Description, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", highContrast: true, children: message }) }),
61
62
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { justify: "end", gap: "2", mt: "5", children: [
62
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Button, { variant: "outline", color: "gray", children: "Cancel" }) }),
63
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Button, { variant: "solid", color: "red", onClick: handleDeleteDomain, children: "Remove domain" })
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Cancel, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: "Cancel" }) }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "destructive", onClick: handleDeleteDomain, children: "Remove domain" })
64
65
  ] })
65
66
  ] })
66
67
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/delete-domain-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { AlertDialog, Button, Flex, Text } from \"@radix-ui/themes\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\n\ninterface DeleteDomainDialogProps {\n children?: React.ReactNode;\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const DeleteDomainDialog = (props: DeleteDomainDialogProps) => {\n const message = (() => {\n switch (props.domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return (\n <>\n <Text size=\"2\">\n Users with the email domain <b>{props.domain.domain}</b> will no\n longer be considered verified. This action is immediate and cannot\n be undone.\n </Text>\n </>\n );\n case \"Failed\":\n return (\n <>\n <Text>\n Are you sure you want to remove the domain{\" \"}\n <b>{props.domain.domain}</b>? This action is immediate and cannot\n be undone.\n </Text>\n </>\n );\n default:\n return (\n <>\n <Text>\n Removing <b>{props.domain.domain}</b> will cancel the DNS record\n verification process. This action is immediate and cannot be\n undone.\n </Text>\n </>\n );\n }\n })();\n\n const handleDeleteDomain = () => {\n props.onDeleteDomain(props.domain.id);\n props.onOpenChange(false);\n };\n\n return (\n <AlertDialog.Root open={props.open} onOpenChange={props.onOpenChange}>\n {props.children && (\n <AlertDialog.Trigger>{props.children}</AlertDialog.Trigger>\n )}\n\n <AlertDialog.Content style={{ maxWidth: \"488px\" }}>\n <AlertDialog.Title mb=\"2\">Remove domain</AlertDialog.Title>\n <AlertDialog.Description>\n <Text size=\"2\" highContrast>\n {message}\n </Text>\n </AlertDialog.Description>\n <Flex justify=\"end\" gap=\"2\" mt=\"5\">\n <AlertDialog.Cancel>\n <Button variant=\"outline\" color=\"gray\">\n Cancel\n </Button>\n </AlertDialog.Cancel>\n <Button variant=\"solid\" color=\"red\" onClick={handleDeleteDomain}>\n Remove domain\n </Button>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBU;AAjBV,oBAAgD;AAWzC,MAAM,qBAAqB,CAAC,UAAmC;AACpE,QAAM,WAAW,MAAM;AACrB,YAAQ,MAAM,OAAO,OAAO;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AACH,eACE,2EACE,uDAAC,sBAAK,MAAK,KAAI;AAAA;AAAA,UACe,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAG1D,GACF;AAAA,MAEJ,KAAK;AACH,eACE,2EACE,uDAAC,sBAAK;AAAA;AAAA,UACuC;AAAA,UAC3C,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAE9B,GACF;AAAA,MAEJ;AACE,eACE,2EACE,uDAAC,sBAAK;AAAA;AAAA,UACK,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAGvC,GACF;AAAA,IAEN;AAAA,EACF,GAAG;AAEH,QAAM,qBAAqB,MAAM;AAC/B,UAAM,eAAe,MAAM,OAAO,EAAE;AACpC,UAAM,aAAa,KAAK;AAAA,EAC1B;AAEA,SACE,6CAAC,0BAAY,MAAZ,EAAiB,MAAM,MAAM,MAAM,cAAc,MAAM,cACrD;AAAA,UAAM,YACL,4CAAC,0BAAY,SAAZ,EAAqB,gBAAM,UAAS;AAAA,IAGvC,6CAAC,0BAAY,SAAZ,EAAoB,OAAO,EAAE,UAAU,QAAQ,GAC9C;AAAA,kDAAC,0BAAY,OAAZ,EAAkB,IAAG,KAAI,2BAAa;AAAA,MACvC,4CAAC,0BAAY,aAAZ,EACC,sDAAC,sBAAK,MAAK,KAAI,cAAY,MACxB,mBACH,GACF;AAAA,MACA,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KAAI,IAAG,KAC7B;AAAA,oDAAC,0BAAY,QAAZ,EACC,sDAAC,wBAAO,SAAQ,WAAU,OAAM,QAAO,oBAEvC,GACF;AAAA,QACA,4CAAC,wBAAO,SAAQ,SAAQ,OAAM,OAAM,SAAS,oBAAoB,2BAEjE;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/delete-domain-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex, Text } from \"@radix-ui/themes\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\nimport { AlertDialog, Button } from \"./elements.js\";\n\ninterface DeleteDomainDialogProps {\n children?: React.ReactNode;\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const DeleteDomainDialog = (props: DeleteDomainDialogProps) => {\n const message = (() => {\n switch (props.domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return (\n <>\n <Text size=\"2\">\n Users with the email domain <b>{props.domain.domain}</b> will no\n longer be considered verified. This action is immediate and cannot\n be undone.\n </Text>\n </>\n );\n case \"Failed\":\n return (\n <>\n <Text>\n Are you sure you want to remove the domain{\" \"}\n <b>{props.domain.domain}</b>? This action is immediate and cannot\n be undone.\n </Text>\n </>\n );\n default:\n return (\n <>\n <Text>\n Removing <b>{props.domain.domain}</b> will cancel the DNS record\n verification process. This action is immediate and cannot be\n undone.\n </Text>\n </>\n );\n }\n })();\n\n const handleDeleteDomain = () => {\n props.onDeleteDomain(props.domain.id);\n props.onOpenChange(false);\n };\n\n return (\n <AlertDialog.Root open={props.open} onOpenChange={props.onOpenChange}>\n {props.children && (\n <AlertDialog.Trigger>{props.children}</AlertDialog.Trigger>\n )}\n\n <AlertDialog.Content style={{ maxWidth: \"488px\" }}>\n <AlertDialog.Title mb=\"2\">Remove domain</AlertDialog.Title>\n <AlertDialog.Description>\n <Text size=\"2\" highContrast>\n {message}\n </Text>\n </AlertDialog.Description>\n <Flex justify=\"end\" gap=\"2\" mt=\"5\">\n <AlertDialog.Cancel>\n <Button variant=\"secondary\">Cancel</Button>\n </AlertDialog.Cancel>\n <Button variant=\"destructive\" onClick={handleDeleteDomain}>\n Remove domain\n </Button>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBU;AAlBV,oBAA2B;AAE3B,sBAAoC;AAU7B,MAAM,qBAAqB,CAAC,UAAmC;AACpE,QAAM,WAAW,MAAM;AACrB,YAAQ,MAAM,OAAO,OAAO;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AACH,eACE,2EACE,uDAAC,sBAAK,MAAK,KAAI;AAAA;AAAA,UACe,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAG1D,GACF;AAAA,MAEJ,KAAK;AACH,eACE,2EACE,uDAAC,sBAAK;AAAA;AAAA,UACuC;AAAA,UAC3C,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAE9B,GACF;AAAA,MAEJ;AACE,eACE,2EACE,uDAAC,sBAAK;AAAA;AAAA,UACK,4CAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAGvC,GACF;AAAA,IAEN;AAAA,EACF,GAAG;AAEH,QAAM,qBAAqB,MAAM;AAC/B,UAAM,eAAe,MAAM,OAAO,EAAE;AACpC,UAAM,aAAa,KAAK;AAAA,EAC1B;AAEA,SACE,6CAAC,4BAAY,MAAZ,EAAiB,MAAM,MAAM,MAAM,cAAc,MAAM,cACrD;AAAA,UAAM,YACL,4CAAC,4BAAY,SAAZ,EAAqB,gBAAM,UAAS;AAAA,IAGvC,6CAAC,4BAAY,SAAZ,EAAoB,OAAO,EAAE,UAAU,QAAQ,GAC9C;AAAA,kDAAC,4BAAY,OAAZ,EAAkB,IAAG,KAAI,2BAAa;AAAA,MACvC,4CAAC,4BAAY,aAAZ,EACC,sDAAC,sBAAK,MAAK,KAAI,cAAY,MACxB,mBACH,GACF;AAAA,MACA,6CAAC,sBAAK,SAAQ,OAAM,KAAI,KAAI,IAAG,KAC7B;AAAA,oDAAC,4BAAY,QAAZ,EACC,sDAAC,0BAAO,SAAQ,aAAY,oBAAM,GACpC;AAAA,QACA,4CAAC,0BAAO,SAAQ,eAAc,SAAS,oBAAoB,2BAE3D;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}