@workos-inc/widgets 1.7.2 → 1.8.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 (214) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cjs/api/endpoint.cjs +1 -0
  3. package/dist/cjs/api/endpoint.cjs.map +1 -1
  4. package/dist/cjs/api/endpoint.d.cts +1 -0
  5. package/dist/cjs/index.cjs +5 -2
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.cts +1 -0
  8. package/dist/cjs/lib/add-mfa-dialog.cjs +133 -61
  9. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  10. package/dist/cjs/lib/admin-portal-domain-verification.cjs +41 -5
  11. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  12. package/dist/cjs/lib/admin-portal-sso-connection.cjs +121 -44
  13. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  14. package/dist/cjs/lib/api-keys/api-key-details-card.cjs +25 -3
  15. package/dist/cjs/lib/api-keys/api-key-details-card.cjs.map +1 -1
  16. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +25 -3
  17. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
  18. package/dist/cjs/lib/api-keys/api-keys-search.cjs +13 -4
  19. package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
  20. package/dist/cjs/lib/api-keys/api-keys-table.cjs +94 -12
  21. package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
  22. package/dist/cjs/lib/api-keys/api-keys.cjs +16 -2
  23. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  24. package/dist/cjs/lib/api-keys/create-api-key.cjs +172 -20
  25. package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
  26. package/dist/cjs/lib/api-keys/relative-time.cjs +12 -2
  27. package/dist/cjs/lib/api-keys/relative-time.cjs.map +1 -1
  28. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +49 -7
  29. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
  30. package/dist/cjs/lib/change-password-dialog.cjs +122 -16
  31. package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
  32. package/dist/cjs/lib/copy-button.cjs +14 -2
  33. package/dist/cjs/lib/copy-button.cjs.map +1 -1
  34. package/dist/cjs/lib/copy-button.d.cts +2 -1
  35. package/dist/cjs/lib/delete-domain-dialog.cjs +52 -19
  36. package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
  37. package/dist/cjs/lib/delete-user-dialog.cjs +46 -11
  38. package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
  39. package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
  40. package/dist/cjs/lib/domain-actions.cjs +51 -7
  41. package/dist/cjs/lib/domain-actions.cjs.map +1 -1
  42. package/dist/cjs/lib/domain-item.cjs +42 -8
  43. package/dist/cjs/lib/domain-item.cjs.map +1 -1
  44. package/dist/cjs/lib/edit-user-profile-dialog.cjs +62 -11
  45. package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
  46. package/dist/cjs/lib/edit-user-role-dialog.cjs +90 -17
  47. package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
  48. package/dist/cjs/lib/elements.cjs +14 -3
  49. package/dist/cjs/lib/elements.cjs.map +1 -1
  50. package/dist/cjs/lib/elements.d.cts +5 -2
  51. package/dist/cjs/lib/elevated-access.cjs +78 -18
  52. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  53. package/dist/cjs/lib/generic-error.cjs +53 -11
  54. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  55. package/dist/cjs/lib/generic-error.d.cts +5 -1
  56. package/dist/cjs/lib/i18n/intl-context.cjs +47 -0
  57. package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -0
  58. package/dist/cjs/lib/i18n/intl-context.d.cts +29 -0
  59. package/dist/cjs/lib/i18n/translation.cjs +67 -0
  60. package/dist/cjs/lib/i18n/translation.cjs.map +1 -0
  61. package/dist/cjs/lib/i18n/translation.d.cts +16 -0
  62. package/dist/cjs/lib/i18n/use-locale.cjs +33 -0
  63. package/dist/cjs/lib/i18n/use-locale.cjs.map +1 -0
  64. package/dist/cjs/lib/i18n/use-locale.d.cts +7 -0
  65. package/dist/cjs/lib/i18n/use-translation.cjs +47 -0
  66. package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -0
  67. package/dist/cjs/lib/i18n/use-translation.d.cts +15 -0
  68. package/dist/cjs/lib/identity-providers.d.cts +1 -1
  69. package/dist/cjs/lib/invite-user-dialog.cjs +69 -14
  70. package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
  71. package/dist/cjs/lib/logout-all-sessions-dialog.cjs +33 -4
  72. package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
  73. package/dist/cjs/lib/logout-dialog.cjs +34 -10
  74. package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
  75. package/dist/cjs/lib/organization-switcher.cjs +12 -2
  76. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  77. package/dist/cjs/lib/pipes.cjs +175 -36
  78. package/dist/cjs/lib/pipes.cjs.map +1 -1
  79. package/dist/cjs/lib/resend-invite-dialog.cjs +67 -17
  80. package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
  81. package/dist/cjs/lib/reset-mfa-dialog.cjs +50 -7
  82. package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
  83. package/dist/cjs/lib/revoke-invite-dialog.cjs +42 -10
  84. package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
  85. package/dist/cjs/lib/save-button.cjs +9 -1
  86. package/dist/cjs/lib/save-button.cjs.map +1 -1
  87. package/dist/cjs/lib/set-password-dialog.cjs +101 -13
  88. package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
  89. package/dist/cjs/lib/user-actions-dropdown.cjs +54 -6
  90. package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
  91. package/dist/cjs/lib/user-profile.cjs +81 -10
  92. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  93. package/dist/cjs/lib/user-security.cjs +127 -25
  94. package/dist/cjs/lib/user-security.cjs.map +1 -1
  95. package/dist/cjs/lib/user-sessions.cjs +74 -15
  96. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  97. package/dist/cjs/lib/users-management.cjs +265 -49
  98. package/dist/cjs/lib/users-management.cjs.map +1 -1
  99. package/dist/cjs/lib/users-search.cjs +18 -4
  100. package/dist/cjs/lib/users-search.cjs.map +1 -1
  101. package/dist/cjs/lib/utils.cjs +10 -7
  102. package/dist/cjs/lib/utils.cjs.map +1 -1
  103. package/dist/cjs/lib/utils.d.cts +2 -1
  104. package/dist/cjs/lib/view-dns-record-dialog.cjs +89 -18
  105. package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
  106. package/dist/cjs/workos-widgets.client.cjs +2 -2
  107. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  108. package/dist/esm/api/endpoint.d.ts +1 -0
  109. package/dist/esm/api/endpoint.js +1 -0
  110. package/dist/esm/api/endpoint.js.map +1 -1
  111. package/dist/esm/index.d.ts +1 -0
  112. package/dist/esm/index.js +3 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/lib/add-mfa-dialog.js +133 -61
  115. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  116. package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
  117. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  118. package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
  119. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  120. package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
  121. package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
  122. package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
  123. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  124. package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
  125. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  126. package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
  127. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  128. package/dist/esm/lib/api-keys/api-keys.js +16 -2
  129. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  130. package/dist/esm/lib/api-keys/create-api-key.js +172 -20
  131. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  132. package/dist/esm/lib/api-keys/relative-time.js +12 -2
  133. package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
  134. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
  135. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  136. package/dist/esm/lib/change-password-dialog.js +122 -16
  137. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  138. package/dist/esm/lib/copy-button.d.ts +2 -1
  139. package/dist/esm/lib/copy-button.js +14 -2
  140. package/dist/esm/lib/copy-button.js.map +1 -1
  141. package/dist/esm/lib/delete-domain-dialog.js +52 -19
  142. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  143. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  144. package/dist/esm/lib/delete-user-dialog.js +36 -11
  145. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  146. package/dist/esm/lib/domain-actions.js +41 -7
  147. package/dist/esm/lib/domain-actions.js.map +1 -1
  148. package/dist/esm/lib/domain-item.js +42 -8
  149. package/dist/esm/lib/domain-item.js.map +1 -1
  150. package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
  151. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  152. package/dist/esm/lib/edit-user-role-dialog.js +90 -17
  153. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  154. package/dist/esm/lib/elements.d.ts +5 -2
  155. package/dist/esm/lib/elements.js +14 -3
  156. package/dist/esm/lib/elements.js.map +1 -1
  157. package/dist/esm/lib/elevated-access.js +78 -18
  158. package/dist/esm/lib/elevated-access.js.map +1 -1
  159. package/dist/esm/lib/generic-error.d.ts +5 -1
  160. package/dist/esm/lib/generic-error.js +53 -11
  161. package/dist/esm/lib/generic-error.js.map +1 -1
  162. package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
  163. package/dist/esm/lib/i18n/intl-context.js +12 -0
  164. package/dist/esm/lib/i18n/intl-context.js.map +1 -0
  165. package/dist/esm/lib/i18n/translation.d.ts +16 -0
  166. package/dist/esm/lib/i18n/translation.js +45 -0
  167. package/dist/esm/lib/i18n/translation.js.map +1 -0
  168. package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
  169. package/dist/esm/lib/i18n/use-locale.js +9 -0
  170. package/dist/esm/lib/i18n/use-locale.js.map +1 -0
  171. package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
  172. package/dist/esm/lib/i18n/use-translation.js +23 -0
  173. package/dist/esm/lib/i18n/use-translation.js.map +1 -0
  174. package/dist/esm/lib/identity-providers.d.ts +1 -1
  175. package/dist/esm/lib/invite-user-dialog.js +70 -15
  176. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  177. package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
  178. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  179. package/dist/esm/lib/logout-dialog.js +34 -10
  180. package/dist/esm/lib/logout-dialog.js.map +1 -1
  181. package/dist/esm/lib/organization-switcher.js +12 -2
  182. package/dist/esm/lib/organization-switcher.js.map +1 -1
  183. package/dist/esm/lib/pipes.js +175 -36
  184. package/dist/esm/lib/pipes.js.map +1 -1
  185. package/dist/esm/lib/resend-invite-dialog.js +67 -17
  186. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  187. package/dist/esm/lib/reset-mfa-dialog.js +50 -7
  188. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  189. package/dist/esm/lib/revoke-invite-dialog.js +42 -10
  190. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  191. package/dist/esm/lib/save-button.js +9 -1
  192. package/dist/esm/lib/save-button.js.map +1 -1
  193. package/dist/esm/lib/set-password-dialog.js +101 -13
  194. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  195. package/dist/esm/lib/user-actions-dropdown.js +54 -6
  196. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  197. package/dist/esm/lib/user-profile.js +81 -10
  198. package/dist/esm/lib/user-profile.js.map +1 -1
  199. package/dist/esm/lib/user-security.js +127 -25
  200. package/dist/esm/lib/user-security.js.map +1 -1
  201. package/dist/esm/lib/user-sessions.js +74 -15
  202. package/dist/esm/lib/user-sessions.js.map +1 -1
  203. package/dist/esm/lib/users-management.js +266 -51
  204. package/dist/esm/lib/users-management.js.map +1 -1
  205. package/dist/esm/lib/users-search.js +18 -4
  206. package/dist/esm/lib/users-search.js.map +1 -1
  207. package/dist/esm/lib/utils.d.ts +2 -1
  208. package/dist/esm/lib/utils.js +10 -7
  209. package/dist/esm/lib/utils.js.map +1 -1
  210. package/dist/esm/lib/view-dns-record-dialog.js +89 -18
  211. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  212. package/dist/esm/workos-widgets.client.js +2 -2
  213. package/dist/esm/workos-widgets.client.js.map +1 -1
  214. package/package.json +11 -2
@@ -3,6 +3,7 @@ import * as React from "react";
3
3
  import { IconButton, Button } from "./elements.js";
4
4
  import { CheckIcon, CopyIcon } from "@radix-ui/react-icons";
5
5
  import { Slot, Slottable } from "@radix-ui/themes";
6
+ import { useTranslation } from "./i18n/use-translation.js";
6
7
  const CopyButton = React.forwardRef(
7
8
  function CopyButton2({ value, asChild, children, style, withIcon = false, ...props }, ref) {
8
9
  const Comp = asChild ? Slot : Button;
@@ -15,14 +16,25 @@ const CopyButton = React.forwardRef(
15
16
  );
16
17
  const CopyIconButton = React.forwardRef(function CopyIconButton2({ value, style, ...props }, ref) {
17
18
  const [hasCopied, copy] = useCopy(value);
19
+ const translate = useTranslation();
20
+ const copiedText = translate({
21
+ defaultMessage: "Copied",
22
+ id: "xgUx3Z",
23
+ description: "Text shown after content has been copied"
24
+ });
25
+ const copyToClipboardText = translate({
26
+ defaultMessage: "Copy to clipboard",
27
+ id: "h9d9dv",
28
+ description: "Button text to copy content to clipboard"
29
+ });
18
30
  return /* @__PURE__ */ jsx(
19
31
  IconButton,
20
32
  {
21
33
  type: "button",
22
34
  onPointerUp: copy,
23
35
  ref,
24
- title: hasCopied ? "Copied" : "Copy to clipboard",
25
- "aria-label": "Copy to clipboard",
36
+ title: hasCopied ? copiedText : copyToClipboardText,
37
+ "aria-label": copyToClipboardText,
26
38
  ...props,
27
39
  children: hasCopied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {})
28
40
  }
@@ -1 +1 @@
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":"AAsBM,SAEiB,KAFjB;AAtBN,YAAY,WAAW;AACvB,SAAS,YAAY,cAAc;AACnC,SAAS,WAAW,gBAAgB;AACpC,SAAS,MAAM,iBAAiB;AAWzB,MAAM,aAAa,MAAM;AAAA,EAC9B,SAASA,YACP,EAAE,OAAO,SAAS,UAAU,OAAO,WAAW,OAAO,GAAG,MAAM,GAC9D,KACA;AACA,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,WACE,qBAAC,QAAK,MAAK,UAAS,aAAa,MAAM,KAAW,GAAG,OAClD;AAAA,mBACE,YAAY,oBAAC,aAAU,eAAW,MAAC,IAAK,oBAAC,YAAS,eAAW,MAAC;AAAA,MACjE,oBAAC,aAAW,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,oBAAC,aAAU,IAAK,oBAAC,YAAS;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
+ {"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\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\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\" | \"title\" | keyof CopyIconButtonOwnProps\n > {\n title?: string;\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 const translate = useTranslation();\n const copiedText = translate({\n defaultMessage: \"Copied\",\n id: \"xgUx3Z\",\n description: \"Text shown after content has been copied\",\n });\n const copyToClipboardText = translate({\n defaultMessage: \"Copy to clipboard\",\n id: \"h9d9dv\",\n description: \"Button text to copy content to clipboard\",\n });\n return (\n <IconButton\n type=\"button\"\n onPointerUp={copy}\n ref={ref}\n title={hasCopied ? copiedText : copyToClipboardText}\n aria-label={copyToClipboardText}\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":"AAuBM,SAEiB,KAFjB;AAvBN,YAAY,WAAW;AACvB,SAAS,YAAY,cAAc;AACnC,SAAS,WAAW,gBAAgB;AACpC,SAAS,MAAM,iBAAiB;AAChC,SAAS,sBAAsB;AAWxB,MAAM,aAAa,MAAM;AAAA,EAC9B,SAASA,YACP,EAAE,OAAO,SAAS,UAAU,OAAO,WAAW,OAAO,GAAG,MAAM,GAC9D,KACA;AACA,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,WACE,qBAAC,QAAK,MAAK,UAAS,aAAa,MAAM,KAAW,GAAG,OAClD;AAAA,mBACE,YAAY,oBAAC,aAAU,eAAW,MAAC,IAAK,oBAAC,YAAS,eAAW,MAAC;AAAA,MACjE,oBAAC,aAAW,UAAS;AAAA,OACvB;AAAA,EAEJ;AACF;AAeO,MAAM,iBAAiB,MAAM,WAGlC,SAASC,gBAAe,EAAE,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK;AACzD,QAAM,CAAC,WAAW,IAAI,IAAI,QAAQ,KAAK;AACvC,QAAM,YAAY,eAAe;AACjC,QAAM,aAAa,UAAU;AAAA,IAC3B,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AACD,QAAM,sBAAsB,UAAU;AAAA,IACpC,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAa;AAAA,MACb;AAAA,MACA,OAAO,YAAY,aAAa;AAAA,MAChC,cAAY;AAAA,MACX,GAAG;AAAA,MAEH,sBAAY,oBAAC,aAAU,IAAK,oBAAC,YAAS;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"]}
@@ -2,29 +2,41 @@
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Flex, Text } from "@radix-ui/themes";
4
4
  import { AlertDialog, Button } from "./elements.js";
5
+ import { Translation } from "./i18n/translation.js";
5
6
  const DeleteDomainDialog = (props) => {
6
7
  const message = (() => {
7
8
  switch (props.domain.state) {
8
9
  case "Verified":
9
10
  case "LegacyVerified":
10
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Text, { size: "2", children: [
11
- "Users with the email domain ",
12
- /* @__PURE__ */ jsx("b", { children: props.domain.domain }),
13
- " will no longer be considered verified. This action is immediate and cannot be undone."
14
- ] }) });
11
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Text, { size: "2", children: /* @__PURE__ */ jsx(
12
+ Translation,
13
+ {
14
+ defaultMessage: "Users with the email domain {domain} will no longer be considered verified. This action is immediate and cannot be undone.",
15
+ id: "HPEjJe",
16
+ description: "Warning message for removing a verified domain",
17
+ values: { domain: /* @__PURE__ */ jsx("b", { children: props.domain.domain }) }
18
+ }
19
+ ) }) });
15
20
  case "Failed":
16
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Text, { children: [
17
- "Are you sure you want to remove the domain",
18
- " ",
19
- /* @__PURE__ */ jsx("b", { children: props.domain.domain }),
20
- "? This action is immediate and cannot be undone."
21
- ] }) });
21
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Text, { children: /* @__PURE__ */ jsx(
22
+ Translation,
23
+ {
24
+ defaultMessage: "Are you sure you want to remove the domain {domain}? This action is immediate and cannot be undone.",
25
+ id: "ig3G/s",
26
+ description: "Warning message for removing a failed domain",
27
+ values: { domain: /* @__PURE__ */ jsx("b", { children: props.domain.domain }) }
28
+ }
29
+ ) }) });
22
30
  default:
23
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Text, { children: [
24
- "Removing ",
25
- /* @__PURE__ */ jsx("b", { children: props.domain.domain }),
26
- " will cancel the DNS record verification process. This action is immediate and cannot be undone."
27
- ] }) });
31
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Text, { children: /* @__PURE__ */ jsx(
32
+ Translation,
33
+ {
34
+ defaultMessage: "Removing {domain} will cancel the DNS record verification process. This action is immediate and cannot be undone.",
35
+ id: "zx2oPb",
36
+ description: "Warning message for removing a domain in verification",
37
+ values: { domain: /* @__PURE__ */ jsx("b", { children: props.domain.domain }) }
38
+ }
39
+ ) }) });
28
40
  }
29
41
  })();
30
42
  const handleDeleteDomain = () => {
@@ -34,11 +46,32 @@ const DeleteDomainDialog = (props) => {
34
46
  return /* @__PURE__ */ jsxs(AlertDialog.Root, { open: props.open, onOpenChange: props.onOpenChange, children: [
35
47
  props.children && /* @__PURE__ */ jsx(AlertDialog.Trigger, { children: props.children }),
36
48
  /* @__PURE__ */ jsxs(AlertDialog.Content, { style: { maxWidth: "488px" }, children: [
37
- /* @__PURE__ */ jsx(AlertDialog.Title, { mb: "2", children: "Remove domain" }),
49
+ /* @__PURE__ */ jsx(AlertDialog.Title, { mb: "2", children: /* @__PURE__ */ jsx(
50
+ Translation,
51
+ {
52
+ defaultMessage: "Remove domain",
53
+ id: "0stiTP",
54
+ description: "Dialog title for removing a domain"
55
+ }
56
+ ) }),
38
57
  /* @__PURE__ */ jsx(AlertDialog.Description, { children: /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, children: message }) }),
39
58
  /* @__PURE__ */ jsxs(Flex, { justify: "end", gap: "2", mt: "5", children: [
40
- /* @__PURE__ */ jsx(AlertDialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: "Cancel" }) }),
41
- /* @__PURE__ */ jsx(Button, { variant: "destructive", onClick: handleDeleteDomain, children: "Remove domain" })
59
+ /* @__PURE__ */ jsx(AlertDialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", children: /* @__PURE__ */ jsx(
60
+ Translation,
61
+ {
62
+ defaultMessage: "Cancel",
63
+ id: "hHNj31",
64
+ description: "Cancel button text"
65
+ }
66
+ ) }) }),
67
+ /* @__PURE__ */ jsx(Button, { variant: "destructive", onClick: handleDeleteDomain, children: /* @__PURE__ */ jsx(
68
+ Translation,
69
+ {
70
+ defaultMessage: "Remove domain",
71
+ id: "OkjVyP",
72
+ description: "Confirm button text to remove domain"
73
+ }
74
+ ) })
42
75
  ] })
43
76
  ] })
44
77
  ] });
@@ -1 +1 @@
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":";AAqBU,mBAEgC,KAD9B,YADF;AAlBV,SAAS,MAAM,YAAY;AAE3B,SAAS,aAAa,cAAc;AAU7B,MAAM,qBAAqB,CAAC,UAAmC;AACpE,QAAM,WAAW,MAAM;AACrB,YAAQ,MAAM,OAAO,OAAO;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AACH,eACE,gCACE,+BAAC,QAAK,MAAK,KAAI;AAAA;AAAA,UACe,oBAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAG1D,GACF;AAAA,MAEJ,KAAK;AACH,eACE,gCACE,+BAAC,QAAK;AAAA;AAAA,UACuC;AAAA,UAC3C,oBAAC,OAAG,gBAAM,OAAO,QAAO;AAAA,UAAI;AAAA,WAE9B,GACF;AAAA,MAEJ;AACE,eACE,gCACE,+BAAC,QAAK;AAAA;AAAA,UACK,oBAAC,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,qBAAC,YAAY,MAAZ,EAAiB,MAAM,MAAM,MAAM,cAAc,MAAM,cACrD;AAAA,UAAM,YACL,oBAAC,YAAY,SAAZ,EAAqB,gBAAM,UAAS;AAAA,IAGvC,qBAAC,YAAY,SAAZ,EAAoB,OAAO,EAAE,UAAU,QAAQ,GAC9C;AAAA,0BAAC,YAAY,OAAZ,EAAkB,IAAG,KAAI,2BAAa;AAAA,MACvC,oBAAC,YAAY,aAAZ,EACC,8BAAC,QAAK,MAAK,KAAI,cAAY,MACxB,mBACH,GACF;AAAA,MACA,qBAAC,QAAK,SAAQ,OAAM,KAAI,KAAI,IAAG,KAC7B;AAAA,4BAAC,YAAY,QAAZ,EACC,8BAAC,UAAO,SAAQ,aAAY,oBAAM,GACpC;AAAA,QACA,oBAAC,UAAO,SAAQ,eAAc,SAAS,oBAAoB,2BAE3D;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\";\nimport { Translation } from \"./i18n/translation.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 <Translation\n defaultMessage=\"Users with the email domain {domain} will no longer be considered verified. This action is immediate and cannot be undone.\"\n id=\"HPEjJe\"\n description=\"Warning message for removing a verified domain\"\n values={{ domain: <b>{props.domain.domain}</b> }}\n />\n </Text>\n </>\n );\n case \"Failed\":\n return (\n <>\n <Text>\n <Translation\n defaultMessage=\"Are you sure you want to remove the domain {domain}? This action is immediate and cannot be undone.\"\n id=\"ig3G/s\"\n description=\"Warning message for removing a failed domain\"\n values={{ domain: <b>{props.domain.domain}</b> }}\n />\n </Text>\n </>\n );\n default:\n return (\n <>\n <Text>\n <Translation\n defaultMessage=\"Removing {domain} will cancel the DNS record verification process. This action is immediate and cannot be undone.\"\n id=\"zx2oPb\"\n description=\"Warning message for removing a domain in verification\"\n values={{ domain: <b>{props.domain.domain}</b> }}\n />\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\">\n <Translation\n defaultMessage=\"Remove domain\"\n id=\"0stiTP\"\n description=\"Dialog title for removing a domain\"\n />\n </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\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </AlertDialog.Cancel>\n <Button variant=\"destructive\" onClick={handleDeleteDomain}>\n <Translation\n defaultMessage=\"Remove domain\"\n id=\"OkjVyP\"\n description=\"Confirm button text to remove domain\"\n />\n </Button>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n};\n"],"mappings":";AAsBU,mBAMwB,KA0D1B,YAhEE;AAnBV,SAAS,MAAM,YAAY;AAE3B,SAAS,aAAa,cAAc;AACpC,SAAS,mBAAmB;AAUrB,MAAM,qBAAqB,CAAC,UAAmC;AACpE,QAAM,WAAW,MAAM;AACrB,YAAQ,MAAM,OAAO,OAAO;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AACH,eACE,gCACE,8BAAC,QAAK,MAAK,KACT;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA,YACZ,QAAQ,EAAE,QAAQ,oBAAC,OAAG,gBAAM,OAAO,QAAO,EAAK;AAAA;AAAA,QACjD,GACF,GACF;AAAA,MAEJ,KAAK;AACH,eACE,gCACE,8BAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA,YACZ,QAAQ,EAAE,QAAQ,oBAAC,OAAG,gBAAM,OAAO,QAAO,EAAK;AAAA;AAAA,QACjD,GACF,GACF;AAAA,MAEJ;AACE,eACE,gCACE,8BAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA,YACZ,QAAQ,EAAE,QAAQ,oBAAC,OAAG,gBAAM,OAAO,QAAO,EAAK;AAAA;AAAA,QACjD,GACF,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,qBAAC,YAAY,MAAZ,EAAiB,MAAM,MAAM,MAAM,cAAc,MAAM,cACrD;AAAA,UAAM,YACL,oBAAC,YAAY,SAAZ,EAAqB,gBAAM,UAAS;AAAA,IAGvC,qBAAC,YAAY,SAAZ,EAAoB,OAAO,EAAE,UAAU,QAAQ,GAC9C;AAAA,0BAAC,YAAY,OAAZ,EAAkB,IAAG,KACpB;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA,oBAAC,YAAY,aAAZ,EACC,8BAAC,QAAK,MAAK,KAAI,cAAY,MACxB,mBACH,GACF;AAAA,MACA,qBAAC,QAAK,SAAQ,OAAM,KAAI,KAAI,IAAG,KAC7B;AAAA,4BAAC,YAAY,QAAZ,EACC,8BAAC,UAAO,SAAQ,aACd;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF,GACF;AAAA,QACA,oBAAC,UAAO,SAAQ,eAAc,SAAS,oBACrC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
2
+ import * as React from 'react';
3
3
  import { RootProps } from '@radix-ui/themes/components/alert-dialog';
4
4
  import { Member } from '../api/endpoint.js';
5
5
  import '@tanstack/react-query';
@@ -9,7 +9,7 @@ interface DeleteUserDialogProps extends RootProps {
9
9
  open: boolean;
10
10
  onOpenChange: (open: boolean) => void;
11
11
  user: Member;
12
- children?: ReactNode;
12
+ children?: React.ReactNode;
13
13
  }
14
14
  declare function DeleteUserDialog({ children, user, ...props }: DeleteUserDialogProps): react_jsx_runtime.JSX.Element;
15
15
 
@@ -1,16 +1,17 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
3
4
  import { Callout, Flex, Text, VisuallyHidden } from "@radix-ui/themes";
4
- import { useRef } from "react";
5
5
  import { useDeleteUser } from "./api/user.js";
6
6
  import { AlertDialog, Button } from "./elements.js";
7
+ import { Translation } from "./i18n/translation.js";
7
8
  function DeleteUserDialog({
8
9
  children,
9
10
  user,
10
11
  ...props
11
12
  }) {
12
13
  const deleteUser = useDeleteUser();
13
- const inputRef = useRef(null);
14
+ const inputRef = React.useRef(null);
14
15
  const onSubmitForm = () => {
15
16
  deleteUser.mutate(
16
17
  { userId: user.id },
@@ -33,13 +34,23 @@ function DeleteUserDialog({
33
34
  });
34
35
  },
35
36
  children: [
36
- /* @__PURE__ */ jsx(AlertDialog.Title, { children: "Remove user" }),
37
- /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "3", children: /* @__PURE__ */ jsxs(AlertDialog.Description, { children: [
38
- "Are you sure you want to remove",
39
- " ",
40
- /* @__PURE__ */ jsx(Text, { weight: "bold", children: user.email }),
41
- "? This action is immediate and cannot be undone."
42
- ] }) }),
37
+ /* @__PURE__ */ jsx(AlertDialog.Title, { children: /* @__PURE__ */ jsx(
38
+ Translation,
39
+ {
40
+ defaultMessage: "Remove user",
41
+ id: "N8aD60",
42
+ description: "Dialog title for removing a user"
43
+ }
44
+ ) }),
45
+ /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "3", children: /* @__PURE__ */ jsx(AlertDialog.Description, { children: /* @__PURE__ */ jsx(
46
+ Translation,
47
+ {
48
+ defaultMessage: "Are you sure you want to remove {email}? This action is immediate and cannot be undone.",
49
+ id: "4zDwGl",
50
+ description: "Warning message for removing a user",
51
+ values: { email: /* @__PURE__ */ jsx(Text, { weight: "bold", children: user.email }) }
52
+ }
53
+ ) }) }),
43
54
  deleteUser.error ? /* @__PURE__ */ jsx(Callout.Root, { color: "red", mt: "4", mb: "-2", children: /* @__PURE__ */ jsx(Callout.Text, { children: getMutationErrorMessage(deleteUser.error) }) }) : null,
44
55
  /* @__PURE__ */ jsx(Flex, { gap: "3", justify: "end", mt: "5", asChild: true, children: /* @__PURE__ */ jsxs(
45
56
  "form",
@@ -49,14 +60,28 @@ function DeleteUserDialog({
49
60
  onSubmitForm();
50
61
  },
51
62
  children: [
52
- /* @__PURE__ */ jsx(AlertDialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", disabled: deleteUser.isPending, children: "Cancel" }) }),
63
+ /* @__PURE__ */ jsx(AlertDialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "secondary", disabled: deleteUser.isPending, children: /* @__PURE__ */ jsx(
64
+ Translation,
65
+ {
66
+ defaultMessage: "Cancel",
67
+ id: "hHNj31",
68
+ description: "Cancel button text"
69
+ }
70
+ ) }) }),
53
71
  /* @__PURE__ */ jsx(
54
72
  Button,
55
73
  {
56
74
  variant: "destructive",
57
75
  type: "submit",
58
76
  loading: deleteUser.isPending,
59
- children: "Remove"
77
+ children: /* @__PURE__ */ jsx(
78
+ Translation,
79
+ {
80
+ defaultMessage: "Remove",
81
+ id: "DJXWAJ",
82
+ description: "Confirm button text to remove user"
83
+ }
84
+ )
60
85
  }
61
86
  )
62
87
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/delete-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport { type ReactNode, useRef } from \"react\";\nimport { useDeleteUser } from \"./api/user.js\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport { Member } from \"../api/endpoint.js\";\n\ninterface DeleteUserDialogProps extends AlertDialog.RootProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: Member;\n children?: ReactNode;\n}\n\nexport function DeleteUserDialog({\n children,\n user,\n ...props\n}: DeleteUserDialogProps) {\n const deleteUser = useDeleteUser();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onSubmitForm = () => {\n deleteUser.mutate(\n { userId: user.id },\n {\n onSuccess: () => {\n props.onOpenChange(false);\n },\n },\n );\n };\n\n return (\n <AlertDialog.Root {...props}>\n {children && <AlertDialog.Trigger>{children}</AlertDialog.Trigger>}\n\n <AlertDialog.Content\n maxWidth=\"480px\"\n onOpenAutoFocus={() => {\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n <AlertDialog.Title>Remove user</AlertDialog.Title>\n <Flex direction=\"column\" gap=\"3\">\n <AlertDialog.Description>\n Are you sure you want to remove{\" \"}\n <Text weight=\"bold\">{user.email}</Text>? This action is immediate\n and cannot be undone.\n </AlertDialog.Description>\n </Flex>\n\n {deleteUser.error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>\n {getMutationErrorMessage(deleteUser.error)}\n </Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button variant=\"secondary\" disabled={deleteUser.isPending}>\n Cancel\n </Button>\n </AlertDialog.Cancel>\n\n <Button\n variant=\"destructive\"\n type=\"submit\"\n loading={deleteUser.isPending}\n >\n Remove\n </Button>\n </form>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(deleteUser.error)}\n </section>\n </VisuallyHidden>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error removing the user. Please try again.\";\n}\n"],"mappings":";AAqCmB,cAYT,YAZS;AAlCnB,SAAS,SAAS,MAAM,MAAM,sBAAsB;AACpD,SAAyB,cAAc;AACvC,SAAS,qBAAqB;AAC9B,SAAS,aAAa,cAAc;AAU7B,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,QAAM,aAAa,cAAc;AACjC,QAAM,WAAW,OAAyB,IAAI;AAE9C,QAAM,eAAe,MAAM;AACzB,eAAW;AAAA,MACT,EAAE,QAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,QACE,WAAW,MAAM;AACf,gBAAM,aAAa,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACE,qBAAC,YAAY,MAAZ,EAAkB,GAAG,OACnB;AAAA,gBAAY,oBAAC,YAAY,SAAZ,EAAqB,UAAS;AAAA,IAE5C;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,UAAS;AAAA,QACT,iBAAiB,MAAM;AACrB,gCAAsB,MAAM;AAC1B,qBAAS,SAAS,MAAM;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QAEA;AAAA,8BAAC,YAAY,OAAZ,EAAkB,yBAAW;AAAA,UAC9B,oBAAC,QAAK,WAAU,UAAS,KAAI,KAC3B,+BAAC,YAAY,aAAZ,EAAwB;AAAA;AAAA,YACS;AAAA,YAChC,oBAAC,QAAK,QAAO,QAAQ,eAAK,OAAM;AAAA,YAAO;AAAA,aAEzC,GACF;AAAA,UAEC,WAAW,QACV,oBAAC,QAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,KAAI,IAAG,MAClC,8BAAC,QAAQ,MAAR,EACE,kCAAwB,WAAW,KAAK,GAC3C,GACF,IACE;AAAA,UAEJ,oBAAC,QAAK,KAAI,KAAI,SAAQ,OAAM,IAAG,KAAI,SAAO,MACxC;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,CAAC,UAAU;AACnB,sBAAM,eAAe;AACrB,6BAAa;AAAA,cACf;AAAA,cAEA;AAAA,oCAAC,YAAY,QAAZ,EACC,8BAAC,UAAO,SAAQ,aAAY,UAAU,WAAW,WAAW,oBAE5D,GACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS,WAAW;AAAA,oBACrB;AAAA;AAAA,gBAED;AAAA;AAAA;AAAA,UACF,GACF;AAAA,UAEA,oBAAC,kBAAe,SAAO,MACrB,8BAAC,aAAQ,aAAU,UAChB,kCAAwB,WAAW,KAAK,GAC3C,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,wBAAwB,OAAgB;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/delete-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport { useDeleteUser } from \"./api/user.js\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport { Member } from \"../api/endpoint.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface DeleteUserDialogProps extends AlertDialog.RootProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: Member;\n children?: React.ReactNode;\n}\n\nexport function DeleteUserDialog({\n children,\n user,\n ...props\n}: DeleteUserDialogProps) {\n const deleteUser = useDeleteUser();\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const onSubmitForm = () => {\n deleteUser.mutate(\n { userId: user.id },\n {\n onSuccess: () => {\n props.onOpenChange(false);\n },\n },\n );\n };\n\n return (\n <AlertDialog.Root {...props}>\n {children && <AlertDialog.Trigger>{children}</AlertDialog.Trigger>}\n\n <AlertDialog.Content\n maxWidth=\"480px\"\n onOpenAutoFocus={() => {\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }}\n >\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Remove user\"\n id=\"N8aD60\"\n description=\"Dialog title for removing a user\"\n />\n </AlertDialog.Title>\n <Flex direction=\"column\" gap=\"3\">\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"Are you sure you want to remove {email}? This action is immediate and cannot be undone.\"\n id=\"4zDwGl\"\n description=\"Warning message for removing a user\"\n values={{ email: <Text weight=\"bold\">{user.email}</Text> }}\n />\n </AlertDialog.Description>\n </Flex>\n\n {deleteUser.error ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>\n {getMutationErrorMessage(deleteUser.error)}\n </Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button variant=\"secondary\" disabled={deleteUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <Button\n variant=\"destructive\"\n type=\"submit\"\n loading={deleteUser.isPending}\n >\n <Translation\n defaultMessage=\"Remove\"\n id=\"DJXWAJ\"\n description=\"Confirm button text to remove user\"\n />\n </Button>\n </form>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">\n {getMutationErrorMessage(deleteUser.error)}\n </section>\n </VisuallyHidden>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n if (!error) {\n return null;\n }\n // TODO Handle server errors\n return \"There was an error removing the user. Please try again.\";\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":";AAqCmB,cAqCT,YArCS;AAnCnB,YAAY,WAAW;AACvB,SAAS,SAAS,MAAM,MAAM,sBAAsB;AACpD,SAAS,qBAAqB;AAC9B,SAAS,aAAa,cAAc;AAEpC,SAAS,mBAAmB;AASrB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,QAAM,aAAa,cAAc;AACjC,QAAM,WAAW,MAAM,OAAyB,IAAI;AAEpD,QAAM,eAAe,MAAM;AACzB,eAAW;AAAA,MACT,EAAE,QAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,QACE,WAAW,MAAM;AACf,gBAAM,aAAa,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACE,qBAAC,YAAY,MAAZ,EAAkB,GAAG,OACnB;AAAA,gBAAY,oBAAC,YAAY,SAAZ,EAAqB,UAAS;AAAA,IAE5C;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,UAAS;AAAA,QACT,iBAAiB,MAAM;AACrB,gCAAsB,MAAM;AAC1B,qBAAS,SAAS,MAAM;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QAEA;AAAA,8BAAC,YAAY,OAAZ,EACC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA;AAAA,UACd,GACF;AAAA,UACA,oBAAC,QAAK,WAAU,UAAS,KAAI,KAC3B,8BAAC,YAAY,aAAZ,EACC;AAAA,YAAC;AAAA;AAAA,cACC,gBAAe;AAAA,cACf,IAAG;AAAA,cACH,aAAY;AAAA,cACZ,QAAQ,EAAE,OAAO,oBAAC,QAAK,QAAO,QAAQ,eAAK,OAAM,EAAQ;AAAA;AAAA,UAC3D,GACF,GACF;AAAA,UAEC,WAAW,QACV,oBAAC,QAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,KAAI,IAAG,MAClC,8BAAC,QAAQ,MAAR,EACE,kCAAwB,WAAW,KAAK,GAC3C,GACF,IACE;AAAA,UAEJ,oBAAC,QAAK,KAAI,KAAI,SAAQ,OAAM,IAAG,KAAI,SAAO,MACxC;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,CAAC,UAAU;AACnB,sBAAM,eAAe;AACrB,6BAAa;AAAA,cACf;AAAA,cAEA;AAAA,oCAAC,YAAY,QAAZ,EACC,8BAAC,UAAO,SAAQ,aAAY,UAAU,WAAW,WAC/C;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAe;AAAA,oBACf,IAAG;AAAA,oBACH,aAAY;AAAA;AAAA,gBACd,GACF,GACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS,WAAW;AAAA,oBAEpB;AAAA,sBAAC;AAAA;AAAA,wBACC,gBAAe;AAAA,wBACf,IAAG;AAAA,wBACH,aAAY;AAAA;AAAA,oBACd;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF,GACF;AAAA,UAEA,oBAAC,kBAAe,SAAO,MACrB,8BAAC,aAAQ,aAAU,UAChB,kCAAwB,WAAW,KAAK,GAC3C,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,wBAAwB,OAAgB;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
@@ -1,17 +1,30 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
3
+ import * as React from "react";
4
4
  import { DotsHorizontalIcon, TrashIcon } from "@radix-ui/react-icons";
5
5
  import { ViewDnsRecordDialog } from "./view-dns-record-dialog.js";
6
6
  import { DeleteDomainDialog } from "./delete-domain-dialog.js";
7
7
  import { DropdownMenu, IconButton } from "./elements.js";
8
+ import { Translation } from "./i18n/translation.js";
9
+ import { useTranslation } from "./i18n/use-translation.js";
8
10
  const DomainActions = ({
9
11
  domain,
10
12
  onDeleteDomain,
11
13
  onReverifyDomain
12
14
  }) => {
13
- const [viewDnsDialogOpen, setViewDnsDialogOpen] = useState(false);
14
- const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
15
+ const [viewDnsDialogOpen, setViewDnsDialogOpen] = React.useState(false);
16
+ const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);
17
+ const translate = useTranslation();
18
+ const removeDomainTitle = translate({
19
+ defaultMessage: "Remove domain",
20
+ id: "Cf+uSR",
21
+ description: "Title for remove domain button"
22
+ });
23
+ const domainActionsTitle = translate({
24
+ defaultMessage: "Domain actions",
25
+ id: "l1mz5q",
26
+ description: "Title for domain actions dropdown button"
27
+ });
15
28
  if (domain.state === "Verified") {
16
29
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
17
30
  DeleteDomainDialog,
@@ -20,21 +33,42 @@ const DomainActions = ({
20
33
  onDeleteDomain,
21
34
  open: deleteDialogOpen,
22
35
  onOpenChange: setDeleteDialogOpen,
23
- children: /* @__PURE__ */ jsx(IconButton, { "aria-label": "Remove domain", title: "Remove domain", children: /* @__PURE__ */ jsx(TrashIcon, {}) })
36
+ children: /* @__PURE__ */ jsx(IconButton, { title: removeDomainTitle, children: /* @__PURE__ */ jsx(TrashIcon, {}) })
24
37
  }
25
38
  ) });
26
39
  }
27
40
  return /* @__PURE__ */ jsxs(Fragment, { children: [
28
41
  /* @__PURE__ */ jsxs(DropdownMenu.Root, { children: [
29
- /* @__PURE__ */ jsx(DropdownMenu.Trigger, { children: /* @__PURE__ */ jsx(IconButton, { "aria-label": "Domain actions", title: "Domain actions", children: /* @__PURE__ */ jsx(DotsHorizontalIcon, {}) }) }),
42
+ /* @__PURE__ */ jsx(DropdownMenu.Trigger, { children: /* @__PURE__ */ jsx(IconButton, { title: domainActionsTitle, children: /* @__PURE__ */ jsx(DotsHorizontalIcon, {}) }) }),
30
43
  /* @__PURE__ */ jsxs(DropdownMenu.Content, { side: "bottom", align: "end", children: [
31
- /* @__PURE__ */ jsx(DropdownMenu.Item, { onClick: () => setViewDnsDialogOpen(true), children: domain.state === "Failed" ? "Restart verification" : "View DNS record" }),
44
+ /* @__PURE__ */ jsx(DropdownMenu.Item, { onClick: () => setViewDnsDialogOpen(true), children: domain.state === "Failed" ? /* @__PURE__ */ jsx(
45
+ Translation,
46
+ {
47
+ defaultMessage: "Restart verification",
48
+ id: "ZJYAji",
49
+ description: "Menu option to restart domain verification"
50
+ }
51
+ ) : /* @__PURE__ */ jsx(
52
+ Translation,
53
+ {
54
+ defaultMessage: "View DNS record",
55
+ id: "74JScV",
56
+ description: "Menu option to view DNS record"
57
+ }
58
+ ) }),
32
59
  /* @__PURE__ */ jsx(
33
60
  DropdownMenu.Item,
34
61
  {
35
62
  variant: "destructive",
36
63
  onClick: () => setDeleteDialogOpen(true),
37
- children: "Remove domain"
64
+ children: /* @__PURE__ */ jsx(
65
+ Translation,
66
+ {
67
+ defaultMessage: "Remove domain",
68
+ id: "cO5+D2",
69
+ description: "Menu option to remove a domain"
70
+ }
71
+ )
38
72
  }
39
73
  )
40
74
  ] })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/domain-actions.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useState } from \"react\";\nimport { DotsHorizontalIcon, TrashIcon } from \"@radix-ui/react-icons\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\nimport { ViewDnsRecordDialog } from \"./view-dns-record-dialog.js\";\nimport { DeleteDomainDialog } from \"./delete-domain-dialog.js\";\nimport { DropdownMenu, IconButton } from \"./elements.js\";\n\ninterface DomainActionsProps {\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n onReverifyDomain: (domainId: string) => void;\n}\n\nexport const DomainActions = ({\n domain,\n onDeleteDomain,\n onReverifyDomain,\n}: DomainActionsProps) => {\n const [viewDnsDialogOpen, setViewDnsDialogOpen] = useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n if (domain.state === \"Verified\") {\n return (\n <>\n <DeleteDomainDialog\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n >\n <IconButton aria-label=\"Remove domain\" title=\"Remove domain\">\n <TrashIcon />\n </IconButton>\n </DeleteDomainDialog>\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>\n <IconButton aria-label=\"Domain actions\" title=\"Domain actions\">\n <DotsHorizontalIcon />\n </IconButton>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content side=\"bottom\" align=\"end\">\n <DropdownMenu.Item onClick={() => setViewDnsDialogOpen(true)}>\n {domain.state === \"Failed\"\n ? \"Restart verification\"\n : \"View DNS record\"}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n variant=\"destructive\"\n onClick={() => setDeleteDialogOpen(true)}\n >\n Remove domain\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n <ViewDnsRecordDialog\n domain={domain}\n onReverifyDomain={onReverifyDomain}\n open={viewDnsDialogOpen}\n onOpenChange={setViewDnsDialogOpen}\n />\n\n <DeleteDomainDialog\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n />\n </>\n );\n};\n"],"mappings":";AA0BM,mBAQM,KAeJ,YAvBF;AAvBN,SAAS,gBAAgB;AACzB,SAAS,oBAAoB,iBAAiB;AAE9C,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,cAAc,kBAAkB;AAQlC,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,MAAI,OAAO,UAAU,YAAY;AAC/B,WACE,gCACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA,QAEd,8BAAC,cAAW,cAAW,iBAAgB,OAAM,iBAC3C,8BAAC,aAAU,GACb;AAAA;AAAA,IACF,GACF;AAAA,EAEJ;AAEA,SACE,iCACE;AAAA,yBAAC,aAAa,MAAb,EACC;AAAA,0BAAC,aAAa,SAAb,EACC,8BAAC,cAAW,cAAW,kBAAiB,OAAM,kBAC5C,8BAAC,sBAAmB,GACtB,GACF;AAAA,MACA,qBAAC,aAAa,SAAb,EAAqB,MAAK,UAAS,OAAM,OACxC;AAAA,4BAAC,aAAa,MAAb,EAAkB,SAAS,MAAM,qBAAqB,IAAI,GACxD,iBAAO,UAAU,WACd,yBACA,mBACN;AAAA,QACA;AAAA,UAAC,aAAa;AAAA,UAAb;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,oBAAoB,IAAI;AAAA,YACxC;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/domain-actions.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { DotsHorizontalIcon, TrashIcon } from \"@radix-ui/react-icons\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\nimport { ViewDnsRecordDialog } from \"./view-dns-record-dialog.js\";\nimport { DeleteDomainDialog } from \"./delete-domain-dialog.js\";\nimport { DropdownMenu, IconButton } from \"./elements.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface DomainActionsProps {\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n onReverifyDomain: (domainId: string) => void;\n}\n\nexport const DomainActions = ({\n domain,\n onDeleteDomain,\n onReverifyDomain,\n}: DomainActionsProps) => {\n const [viewDnsDialogOpen, setViewDnsDialogOpen] = React.useState(false);\n const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);\n const translate = useTranslation();\n\n const removeDomainTitle = translate({\n defaultMessage: \"Remove domain\",\n id: \"Cf+uSR\",\n description: \"Title for remove domain button\",\n });\n\n const domainActionsTitle = translate({\n defaultMessage: \"Domain actions\",\n id: \"l1mz5q\",\n description: \"Title for domain actions dropdown button\",\n });\n\n if (domain.state === \"Verified\") {\n return (\n <>\n <DeleteDomainDialog\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n >\n <IconButton title={removeDomainTitle}>\n <TrashIcon />\n </IconButton>\n </DeleteDomainDialog>\n </>\n );\n }\n\n return (\n <>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger>\n <IconButton title={domainActionsTitle}>\n <DotsHorizontalIcon />\n </IconButton>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content side=\"bottom\" align=\"end\">\n <DropdownMenu.Item onClick={() => setViewDnsDialogOpen(true)}>\n {domain.state === \"Failed\" ? (\n <Translation\n defaultMessage=\"Restart verification\"\n id=\"ZJYAji\"\n description=\"Menu option to restart domain verification\"\n />\n ) : (\n <Translation\n defaultMessage=\"View DNS record\"\n id=\"74JScV\"\n description=\"Menu option to view DNS record\"\n />\n )}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n variant=\"destructive\"\n onClick={() => setDeleteDialogOpen(true)}\n >\n <Translation\n defaultMessage=\"Remove domain\"\n id=\"cO5+D2\"\n description=\"Menu option to remove a domain\"\n />\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n\n <ViewDnsRecordDialog\n domain={domain}\n onReverifyDomain={onReverifyDomain}\n open={viewDnsDialogOpen}\n onOpenChange={setViewDnsDialogOpen}\n />\n\n <DeleteDomainDialog\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n open={deleteDialogOpen}\n onOpenChange={setDeleteDialogOpen}\n />\n </>\n );\n};\n"],"mappings":";AAwCM,mBAQM,KAeJ,YAvBF;AAtCN,YAAY,WAAW;AACvB,SAAS,oBAAoB,iBAAiB;AAE9C,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,cAAc,kBAAkB;AACzC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAQxB,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,MAAM,SAAS,KAAK;AACtE,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,MAAM,SAAS,KAAK;AACpE,QAAM,YAAY,eAAe;AAEjC,QAAM,oBAAoB,UAAU;AAAA,IAClC,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,qBAAqB,UAAU;AAAA,IACnC,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aAAa;AAAA,EACf,CAAC;AAED,MAAI,OAAO,UAAU,YAAY;AAC/B,WACE,gCACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA,QAEd,8BAAC,cAAW,OAAO,mBACjB,8BAAC,aAAU,GACb;AAAA;AAAA,IACF,GACF;AAAA,EAEJ;AAEA,SACE,iCACE;AAAA,yBAAC,aAAa,MAAb,EACC;AAAA,0BAAC,aAAa,SAAb,EACC,8BAAC,cAAW,OAAO,oBACjB,8BAAC,sBAAmB,GACtB,GACF;AAAA,MACA,qBAAC,aAAa,SAAb,EAAqB,MAAK,UAAS,OAAM,OACxC;AAAA,4BAAC,aAAa,MAAb,EAAkB,SAAS,MAAM,qBAAqB,IAAI,GACxD,iBAAO,UAAU,WAChB;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GAEJ;AAAA,QACA;AAAA,UAAC,aAAa;AAAA,UAAb;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,oBAAoB,IAAI;AAAA,YAEvC;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;","names":[]}
@@ -6,20 +6,33 @@ import { getComparativeReadableDate } from "./utils.js";
6
6
  import { Status } from "./status.js";
7
7
  import { NameServerIcon } from "./name-server-icon.js";
8
8
  import { DomainActions } from "./domain-actions.js";
9
+ import { Translation } from "./i18n/translation.js";
10
+ import { useLocale } from "./i18n/use-locale.js";
9
11
  const DomainItem = ({
10
12
  domain,
11
13
  onDeleteDomain,
12
14
  onReverifyDomain
13
15
  }) => {
16
+ const locale = useLocale();
14
17
  return /* @__PURE__ */ jsxs(Flex, { gap: "4", align: "center", children: [
15
18
  /* @__PURE__ */ jsx(IconPanel, { color: domain.nameServer === "Other" ? "gray" : "panel", children: /* @__PURE__ */ jsx(NameServerIcon, { provider: domain.nameServer }) }),
16
19
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
17
20
  /* @__PURE__ */ jsx(Text, { size: "2", highContrast: true, weight: "bold", as: "p", children: domain.domain }),
18
- /* @__PURE__ */ jsxs(Text, { size: "2", color: "gray", as: "p", children: [
19
- "Added",
20
- " ",
21
- getComparativeReadableDate(/* @__PURE__ */ new Date(), new Date(domain.createdAt))
22
- ] })
21
+ /* @__PURE__ */ jsx(Text, { size: "2", color: "gray", as: "p", children: /* @__PURE__ */ jsx(
22
+ Translation,
23
+ {
24
+ defaultMessage: "Added {timeAgo}",
25
+ id: "DtZ2fb",
26
+ description: "Label showing when the domain was added",
27
+ values: {
28
+ timeAgo: getComparativeReadableDate(
29
+ /* @__PURE__ */ new Date(),
30
+ new Date(domain.createdAt),
31
+ { locale }
32
+ )
33
+ }
34
+ }
35
+ ) })
23
36
  ] }),
24
37
  /* @__PURE__ */ jsxs(Flex, { ml: "auto", mr: "2", gap: "4", align: "center", children: [
25
38
  /* @__PURE__ */ jsx(Flex, { gap: "1", align: "center", children: /* @__PURE__ */ jsx(Status, { state: getDomainStatus(domain), children: domainStateToLabel(domain) }) }),
@@ -38,11 +51,32 @@ const domainStateToLabel = (domain) => {
38
51
  switch (domain.state) {
39
52
  case "Verified":
40
53
  case "LegacyVerified":
41
- return "Verified";
54
+ return /* @__PURE__ */ jsx(
55
+ Translation,
56
+ {
57
+ defaultMessage: "Verified",
58
+ id: "T7rpHw",
59
+ description: "Domain verification status indicating the domain is verified"
60
+ }
61
+ );
42
62
  case "Pending":
43
- return "Verification pending";
63
+ return /* @__PURE__ */ jsx(
64
+ Translation,
65
+ {
66
+ defaultMessage: "Verification pending",
67
+ id: "gc1yge",
68
+ description: "Domain verification status indicating verification is in progress"
69
+ }
70
+ );
44
71
  case "Failed":
45
- return "Verification failed";
72
+ return /* @__PURE__ */ jsx(
73
+ Translation,
74
+ {
75
+ defaultMessage: "Verification failed",
76
+ id: "cbbwqK",
77
+ description: "Domain verification status indicating verification has failed"
78
+ }
79
+ );
46
80
  }
47
81
  };
48
82
  const getDomainStatus = (domain) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/domain-item.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Text } from \"@radix-ui/themes\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { getComparativeReadableDate } from \"./utils.js\";\nimport { Status } from \"./status.js\";\nimport { NameServerIcon } from \"./name-server-icon.js\";\nimport { DomainActions } from \"./domain-actions.js\";\n\ninterface DomainItemProps {\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n onReverifyDomain: (domainId: string) => void;\n}\n\nexport const DomainItem = ({\n domain,\n onDeleteDomain,\n onReverifyDomain,\n}: DomainItemProps) => {\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color={domain.nameServer === \"Other\" ? \"gray\" : \"panel\"}>\n <NameServerIcon provider={domain.nameServer} />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\">\n {domain.domain}\n </Text>\n\n <Text size=\"2\" color=\"gray\" as=\"p\">\n Added{\" \"}\n {getComparativeReadableDate(new Date(), new Date(domain.createdAt))}\n </Text>\n </Flex>\n\n <Flex ml=\"auto\" mr=\"2\" gap=\"4\" align=\"center\">\n <Flex gap=\"1\" align=\"center\">\n <Status state={getDomainStatus(domain)}>\n {domainStateToLabel(domain)}\n </Status>\n </Flex>\n\n <DomainActions\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n onReverifyDomain={onReverifyDomain}\n />\n </Flex>\n </Flex>\n );\n};\n\nconst domainStateToLabel = (domain: OrganizationDomain) => {\n switch (domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return \"Verified\";\n case \"Pending\":\n return \"Verification pending\";\n case \"Failed\":\n return \"Verification failed\";\n }\n};\n\nconst getDomainStatus = (domain: OrganizationDomain) => {\n switch (domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return \"success\";\n case \"Pending\":\n return \"waiting\";\n case \"Failed\":\n return \"error\";\n }\n};\n"],"mappings":";AAwBQ,cAQA,YARA;AAtBR,SAAS,MAAM,YAAY;AAE3B,SAAS,iBAAiB;AAC1B,SAAS,kCAAkC;AAC3C,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAQvB,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACrB,SACE,qBAAC,QAAK,KAAI,KAAI,OAAM,UAClB;AAAA,wBAAC,aAAU,OAAO,OAAO,eAAe,UAAU,SAAS,SACzD,8BAAC,kBAAe,UAAU,OAAO,YAAY,GAC/C;AAAA,IAEA,qBAAC,QAAK,WAAU,UACd;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAY,MAAC,QAAO,QAAO,IAAG,KAC1C,iBAAO,QACV;AAAA,MAEA,qBAAC,QAAK,MAAK,KAAI,OAAM,QAAO,IAAG,KAAI;AAAA;AAAA,QAC3B;AAAA,QACL,2BAA2B,oBAAI,KAAK,GAAG,IAAI,KAAK,OAAO,SAAS,CAAC;AAAA,SACpE;AAAA,OACF;AAAA,IAEA,qBAAC,QAAK,IAAG,QAAO,IAAG,KAAI,KAAI,KAAI,OAAM,UACnC;AAAA,0BAAC,QAAK,KAAI,KAAI,OAAM,UAClB,8BAAC,UAAO,OAAO,gBAAgB,MAAM,GAClC,6BAAmB,MAAM,GAC5B,GACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,MAAM,qBAAqB,CAAC,WAA+B;AACzD,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,MAAM,kBAAkB,CAAC,WAA+B;AACtD,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/domain-item.tsx"],"sourcesContent":["\"use client\";\n\nimport { Flex, Text } from \"@radix-ui/themes\";\nimport { OrganizationDomain } from \"../api/endpoint.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { getComparativeReadableDate } from \"./utils.js\";\nimport { Status } from \"./status.js\";\nimport { NameServerIcon } from \"./name-server-icon.js\";\nimport { DomainActions } from \"./domain-actions.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useLocale } from \"./i18n/use-locale.js\";\n\ninterface DomainItemProps {\n domain: OrganizationDomain;\n onDeleteDomain: (domainId: string) => void;\n onReverifyDomain: (domainId: string) => void;\n}\n\nexport const DomainItem = ({\n domain,\n onDeleteDomain,\n onReverifyDomain,\n}: DomainItemProps) => {\n const locale = useLocale();\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color={domain.nameServer === \"Other\" ? \"gray\" : \"panel\"}>\n <NameServerIcon provider={domain.nameServer} />\n </IconPanel>\n\n <Flex direction=\"column\">\n <Text size=\"2\" highContrast weight=\"bold\" as=\"p\">\n {domain.domain}\n </Text>\n\n <Text size=\"2\" color=\"gray\" as=\"p\">\n <Translation\n defaultMessage=\"Added {timeAgo}\"\n id=\"DtZ2fb\"\n description=\"Label showing when the domain was added\"\n values={{\n timeAgo: getComparativeReadableDate(\n new Date(),\n new Date(domain.createdAt),\n { locale },\n ),\n }}\n />\n </Text>\n </Flex>\n\n <Flex ml=\"auto\" mr=\"2\" gap=\"4\" align=\"center\">\n <Flex gap=\"1\" align=\"center\">\n <Status state={getDomainStatus(domain)}>\n {domainStateToLabel(domain)}\n </Status>\n </Flex>\n\n <DomainActions\n domain={domain}\n onDeleteDomain={onDeleteDomain}\n onReverifyDomain={onReverifyDomain}\n />\n </Flex>\n </Flex>\n );\n};\n\nconst domainStateToLabel = (domain: OrganizationDomain) => {\n switch (domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return (\n <Translation\n defaultMessage=\"Verified\"\n id=\"T7rpHw\"\n description=\"Domain verification status indicating the domain is verified\"\n />\n );\n case \"Pending\":\n return (\n <Translation\n defaultMessage=\"Verification pending\"\n id=\"gc1yge\"\n description=\"Domain verification status indicating verification is in progress\"\n />\n );\n case \"Failed\":\n return (\n <Translation\n defaultMessage=\"Verification failed\"\n id=\"cbbwqK\"\n description=\"Domain verification status indicating verification has failed\"\n />\n );\n }\n};\n\nconst getDomainStatus = (domain: OrganizationDomain) => {\n switch (domain.state) {\n case \"Verified\":\n case \"LegacyVerified\":\n return \"success\";\n case \"Pending\":\n return \"waiting\";\n case \"Failed\":\n return \"error\";\n }\n};\n"],"mappings":";AA4BQ,cAGF,YAHE;AA1BR,SAAS,MAAM,YAAY;AAE3B,SAAS,iBAAiB;AAC1B,SAAS,kCAAkC;AAC3C,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAQnB,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACrB,QAAM,SAAS,UAAU;AAEzB,SACE,qBAAC,QAAK,KAAI,KAAI,OAAM,UAClB;AAAA,wBAAC,aAAU,OAAO,OAAO,eAAe,UAAU,SAAS,SACzD,8BAAC,kBAAe,UAAU,OAAO,YAAY,GAC/C;AAAA,IAEA,qBAAC,QAAK,WAAU,UACd;AAAA,0BAAC,QAAK,MAAK,KAAI,cAAY,MAAC,QAAO,QAAO,IAAG,KAC1C,iBAAO,QACV;AAAA,MAEA,oBAAC,QAAK,MAAK,KAAI,OAAM,QAAO,IAAG,KAC7B;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA,UACZ,QAAQ;AAAA,YACN,SAAS;AAAA,cACP,oBAAI,KAAK;AAAA,cACT,IAAI,KAAK,OAAO,SAAS;AAAA,cACzB,EAAE,OAAO;AAAA,YACX;AAAA,UACF;AAAA;AAAA,MACF,GACF;AAAA,OACF;AAAA,IAEA,qBAAC,QAAK,IAAG,QAAO,IAAG,KAAI,KAAI,KAAI,OAAM,UACnC;AAAA,0BAAC,QAAK,KAAI,KAAI,OAAM,UAClB,8BAAC,UAAO,OAAO,gBAAgB,MAAM,GAClC,6BAAmB,MAAM,GAC5B,GACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,MAAM,qBAAqB,CAAC,WAA+B;AACzD,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd;AAAA,EAEN;AACF;AAEA,MAAM,kBAAkB,CAAC,WAA+B;AACtD,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;","names":[]}