@workos-inc/widgets 1.7.1 → 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 (215) hide show
  1. package/CHANGELOG.md +9 -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/css/lib/provider-icon.css +93 -3
  109. package/dist/esm/api/endpoint.d.ts +1 -0
  110. package/dist/esm/api/endpoint.js +1 -0
  111. package/dist/esm/api/endpoint.js.map +1 -1
  112. package/dist/esm/index.d.ts +1 -0
  113. package/dist/esm/index.js +3 -1
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/lib/add-mfa-dialog.js +133 -61
  116. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  117. package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
  118. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  119. package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
  120. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  121. package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
  122. package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
  123. package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
  124. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  125. package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
  126. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  127. package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
  128. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  129. package/dist/esm/lib/api-keys/api-keys.js +16 -2
  130. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  131. package/dist/esm/lib/api-keys/create-api-key.js +172 -20
  132. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  133. package/dist/esm/lib/api-keys/relative-time.js +12 -2
  134. package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
  135. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
  136. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  137. package/dist/esm/lib/change-password-dialog.js +122 -16
  138. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  139. package/dist/esm/lib/copy-button.d.ts +2 -1
  140. package/dist/esm/lib/copy-button.js +14 -2
  141. package/dist/esm/lib/copy-button.js.map +1 -1
  142. package/dist/esm/lib/delete-domain-dialog.js +52 -19
  143. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  144. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  145. package/dist/esm/lib/delete-user-dialog.js +36 -11
  146. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  147. package/dist/esm/lib/domain-actions.js +41 -7
  148. package/dist/esm/lib/domain-actions.js.map +1 -1
  149. package/dist/esm/lib/domain-item.js +42 -8
  150. package/dist/esm/lib/domain-item.js.map +1 -1
  151. package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
  152. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  153. package/dist/esm/lib/edit-user-role-dialog.js +90 -17
  154. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  155. package/dist/esm/lib/elements.d.ts +5 -2
  156. package/dist/esm/lib/elements.js +14 -3
  157. package/dist/esm/lib/elements.js.map +1 -1
  158. package/dist/esm/lib/elevated-access.js +78 -18
  159. package/dist/esm/lib/elevated-access.js.map +1 -1
  160. package/dist/esm/lib/generic-error.d.ts +5 -1
  161. package/dist/esm/lib/generic-error.js +53 -11
  162. package/dist/esm/lib/generic-error.js.map +1 -1
  163. package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
  164. package/dist/esm/lib/i18n/intl-context.js +12 -0
  165. package/dist/esm/lib/i18n/intl-context.js.map +1 -0
  166. package/dist/esm/lib/i18n/translation.d.ts +16 -0
  167. package/dist/esm/lib/i18n/translation.js +45 -0
  168. package/dist/esm/lib/i18n/translation.js.map +1 -0
  169. package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
  170. package/dist/esm/lib/i18n/use-locale.js +9 -0
  171. package/dist/esm/lib/i18n/use-locale.js.map +1 -0
  172. package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
  173. package/dist/esm/lib/i18n/use-translation.js +23 -0
  174. package/dist/esm/lib/i18n/use-translation.js.map +1 -0
  175. package/dist/esm/lib/identity-providers.d.ts +1 -1
  176. package/dist/esm/lib/invite-user-dialog.js +70 -15
  177. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  178. package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
  179. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  180. package/dist/esm/lib/logout-dialog.js +34 -10
  181. package/dist/esm/lib/logout-dialog.js.map +1 -1
  182. package/dist/esm/lib/organization-switcher.js +12 -2
  183. package/dist/esm/lib/organization-switcher.js.map +1 -1
  184. package/dist/esm/lib/pipes.js +175 -36
  185. package/dist/esm/lib/pipes.js.map +1 -1
  186. package/dist/esm/lib/resend-invite-dialog.js +67 -17
  187. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  188. package/dist/esm/lib/reset-mfa-dialog.js +50 -7
  189. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  190. package/dist/esm/lib/revoke-invite-dialog.js +42 -10
  191. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  192. package/dist/esm/lib/save-button.js +9 -1
  193. package/dist/esm/lib/save-button.js.map +1 -1
  194. package/dist/esm/lib/set-password-dialog.js +101 -13
  195. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  196. package/dist/esm/lib/user-actions-dropdown.js +54 -6
  197. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  198. package/dist/esm/lib/user-profile.js +81 -10
  199. package/dist/esm/lib/user-profile.js.map +1 -1
  200. package/dist/esm/lib/user-security.js +127 -25
  201. package/dist/esm/lib/user-security.js.map +1 -1
  202. package/dist/esm/lib/user-sessions.js +74 -15
  203. package/dist/esm/lib/user-sessions.js.map +1 -1
  204. package/dist/esm/lib/users-management.js +266 -51
  205. package/dist/esm/lib/users-management.js.map +1 -1
  206. package/dist/esm/lib/users-search.js +18 -4
  207. package/dist/esm/lib/users-search.js.map +1 -1
  208. package/dist/esm/lib/utils.d.ts +2 -1
  209. package/dist/esm/lib/utils.js +10 -7
  210. package/dist/esm/lib/utils.js.map +1 -1
  211. package/dist/esm/lib/view-dns-record-dialog.js +89 -18
  212. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  213. package/dist/esm/workos-widgets.client.js +2 -2
  214. package/dist/esm/workos-widgets.client.js.map +1 -1
  215. package/package.json +13 -4
@@ -46,6 +46,8 @@ var import_provider_icon = require("./provider-icon.js");
46
46
  var import_identity_providers = require("./identity-providers.js");
47
47
  var import_status = require("./status.js");
48
48
  var import_utils = require("./utils.js");
49
+ var import_translation = require("./i18n/translation.js");
50
+ var import_use_translation = require("./i18n/use-translation.js");
49
51
  var import_generic_error = require("./generic-error.js");
50
52
  const AdminPortalSsoConnectionContext = React.createContext(null);
51
53
  AdminPortalSsoConnectionContext.displayName = "AdminPortalSsoConnectionContext";
@@ -71,7 +73,14 @@ const AdminPortalSsoConnection = ({
71
73
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardList.Item, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { direction: "row", justify: "between", align: "center", gap: "2", children: (() => {
72
74
  if (connectionStatus === "NotConfigured") {
73
75
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
74
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "gray", children: "You haven\u2019t set up Single Sign-On yet." }),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "gray", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
77
+ import_translation.Translation,
78
+ {
79
+ defaultMessage: "You haven't set up Single Sign-On yet.",
80
+ id: "KDs1Ib",
81
+ description: "Empty state message when SSO is not configured"
82
+ }
83
+ ) }),
75
84
  adminPortalOpenButton
76
85
  ] });
77
86
  }
@@ -95,42 +104,62 @@ const AdminPortalSsoConnection = ({
95
104
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { asChild: true, mt: "2px", flexShrink: "0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.InfoCircledIcon, { color: "gray" }) }),
96
105
  (() => {
97
106
  if (connectionStatus === "Expired") {
98
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Text, { size: "2", color: "gray", children: [
99
- (() => {
100
- if (!expiryDate) {
101
- return "The SAML response signing certificate has expired";
107
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "gray", children: (() => {
108
+ if (!expiryDate) {
109
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
110
+ import_translation.Translation,
111
+ {
112
+ defaultMessage: "The SAML response signing certificate has expired. Users won't be able to sign-in to the application until the certificate is renewed.",
113
+ id: "5tX19v",
114
+ description: "Error message when SAML certificate has expired (no date)"
115
+ }
116
+ );
117
+ }
118
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
119
+ import_translation.Translation,
120
+ {
121
+ defaultMessage: "The SAML response signing certificate expired on {expiryDate}. Users won't be able to sign-in to the application until the certificate is renewed.",
122
+ id: "vmTW/h",
123
+ description: "Error message when SAML certificate has expired with date",
124
+ values: {
125
+ expiryDate: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", as: "span", children: expiryDate?.toLocaleString("en-US", {
126
+ month: "long",
127
+ day: "numeric",
128
+ year: "numeric"
129
+ }) })
130
+ }
102
131
  }
103
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
104
- "The SAML response signing certificate expired on",
105
- " ",
106
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", as: "span", children: expiryDate?.toLocaleString("en-US", {
107
- month: "long",
108
- day: "numeric",
109
- year: "numeric"
110
- }) })
111
- ] });
112
- })(),
113
- ". Users won\u2019t be able to sign-in to the application until the certificate is renewed."
114
- ] });
132
+ );
133
+ })() });
115
134
  }
116
135
  if (connectionStatus === "Expiring") {
117
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Text, { size: "2", color: "gray", children: [
118
- (() => {
119
- if (!expiryDate) {
120
- return "The SAML response signing certificate is expiring soon";
136
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", color: "gray", children: (() => {
137
+ if (!expiryDate) {
138
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
139
+ import_translation.Translation,
140
+ {
141
+ defaultMessage: "The SAML response signing certificate is expiring soon. When expired, users won't be able to sign-in.",
142
+ id: "3dgA5f",
143
+ description: "Warning message when SAML certificate is expiring soon (no date)"
144
+ }
145
+ );
146
+ }
147
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
148
+ import_translation.Translation,
149
+ {
150
+ defaultMessage: "The SAML response signing certificate will expire on {expiryDate}. When expired, users won't be able to sign-in.",
151
+ id: "xT9Exy",
152
+ description: "Warning message when SAML certificate is expiring with date",
153
+ values: {
154
+ expiryDate: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", as: "span", children: expiryDate?.toLocaleString("en-US", {
155
+ month: "long",
156
+ day: "numeric",
157
+ year: "numeric"
158
+ }) })
159
+ }
121
160
  }
122
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
123
- "The SAML response signing certificate will expire on",
124
- " ",
125
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { weight: "bold", as: "span", children: expiryDate?.toLocaleString("en-US", {
126
- month: "long",
127
- day: "numeric",
128
- year: "numeric"
129
- }) })
130
- ] });
131
- })(),
132
- ". When expired, users won\u2019t be able to sign-in."
133
- ] });
161
+ );
162
+ })() });
134
163
  }
135
164
  })()
136
165
  ] }) })
@@ -143,13 +172,34 @@ function SsoStatus({
143
172
  return null;
144
173
  }
145
174
  if (status === "Inactive") {
146
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "waiting", children: "Setup in progress" });
175
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "waiting", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
176
+ import_translation.Translation,
177
+ {
178
+ defaultMessage: "Setup in progress",
179
+ id: "MQR5mR",
180
+ description: "Status label when SSO setup is incomplete"
181
+ }
182
+ ) });
147
183
  }
148
184
  if (status === "Expired") {
149
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "error", children: "Requires action" });
185
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "error", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
186
+ import_translation.Translation,
187
+ {
188
+ defaultMessage: "Requires action",
189
+ id: "Yo2vHC",
190
+ description: "Status label when SSO requires attention"
191
+ }
192
+ ) });
150
193
  }
151
194
  if (status === "Active" || status === "Expiring") {
152
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "success", children: "Connected" });
195
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_status.Status, { state: "success", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
196
+ import_translation.Translation,
197
+ {
198
+ defaultMessage: "Connected",
199
+ id: "8S+Cyw",
200
+ description: "Status label when SSO is active"
201
+ }
202
+ ) });
153
203
  }
154
204
  return (0, import_utils.unreachable)(status);
155
205
  }
@@ -169,10 +219,15 @@ function SessionInfo({
169
219
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icon_panel.IconPanel, { color: "panel", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_provider_icon.ProviderIcon, { provider: identityProvider, size: "2" }) }),
170
220
  lastSession ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", children: [
171
221
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", weight: "bold", children: (0, import_identity_providers.getIdentityProviderName)(identityProvider) }),
172
- relativeTimeString ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Text, { color: "gray", size: "2", children: [
173
- "Last session ",
174
- relativeTimeString
175
- ] }) : null
222
+ relativeTimeString ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { color: "gray", size: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ import_translation.Translation,
224
+ {
225
+ defaultMessage: "Last session {relativeTime}",
226
+ id: "yN72Gc",
227
+ description: "Label showing when the last SSO session occurred",
228
+ values: { relativeTime: relativeTimeString }
229
+ }
230
+ ) }) : null
176
231
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", weight: "bold", children: (0, import_identity_providers.getIdentityProviderName)(identityProvider) })
177
232
  ] });
178
233
  }
@@ -185,13 +240,34 @@ function AdminPortalOpenButton({
185
240
  const label = (() => {
186
241
  switch (connectionStatus) {
187
242
  case "NotConfigured":
188
- return "Set up SSO";
243
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
244
+ import_translation.Translation,
245
+ {
246
+ defaultMessage: "Set up SSO",
247
+ id: "MtkNQO",
248
+ description: "Button label to start SSO setup"
249
+ }
250
+ );
189
251
  case "Inactive":
190
- return "Continue setup";
252
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
253
+ import_translation.Translation,
254
+ {
255
+ defaultMessage: "Continue setup",
256
+ id: "HFxrbY",
257
+ description: "Button label to continue incomplete SSO setup"
258
+ }
259
+ );
191
260
  case "Active":
192
261
  case "Expiring":
193
262
  case "Expired":
194
- return "Manage";
263
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
264
+ import_translation.Translation,
265
+ {
266
+ defaultMessage: "Manage",
267
+ id: "T1VKzP",
268
+ description: "Button label to manage SSO settings"
269
+ }
270
+ );
195
271
  default:
196
272
  return (0, import_utils.unreachable)(connectionStatus);
197
273
  }
@@ -237,10 +313,11 @@ const AdminPortalSsoConnectionLoading = (props) => {
237
313
  ] }) });
238
314
  };
239
315
  const AdminPortalSsoConnectionError = ({ error, ...domProps }) => {
316
+ const translate = (0, import_use_translation.useTranslation)();
240
317
  React.useEffect(() => {
241
318
  console.error(error);
242
319
  }, [error]);
243
- const { heading, message } = (0, import_generic_error.getErrorMessage)(error);
320
+ const { heading, message } = (0, import_generic_error.getErrorMessage)(error, translate);
244
321
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Card, { size: "2", ...getWidgetRootDomProps("error", domProps), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { direction: "row", justify: "between", align: "center", gap: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { gap: "4", align: "center", children: [
245
322
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
246
323
  import_themes.Flex,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/admin-portal-sso-connection.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Box, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { Button, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport {\n ExternalLinkIcon,\n InfoCircledIcon,\n Cross2Icon,\n} from \"@radix-ui/react-icons\";\nimport * as CardList from \"./card-list.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n getIdentityProviderName,\n type IdentityProvider,\n} from \"./identity-providers.js\";\nimport { Status } from \"./status.js\";\nimport {\n getDomProps,\n unreachable,\n type WidgetRootState,\n type WidgetRootDomProps,\n} from \"./utils.js\";\nimport { getErrorMessage } from \"./generic-error.js\";\n\ninterface NotConfiguredProps {\n connectionStatus: \"NotConfigured\";\n identityProvider?: never;\n expiryDate?: never;\n}\n\ninterface InactiveProps {\n connectionStatus: \"Inactive\";\n identityProvider: IdentityProvider;\n expiryDate?: never;\n}\n\ninterface ActiveProps {\n connectionStatus: \"Active\";\n identityProvider: IdentityProvider;\n expiryDate?: never;\n}\n\ninterface RequiresActionProps {\n connectionStatus: \"Expired\" | \"Expiring\";\n identityProvider: IdentityProvider;\n expiryDate: Date | null;\n}\n\nexport type AdminPortalSsoConnectionStatusProps =\n | NotConfiguredProps\n | InactiveProps\n | ActiveProps\n | RequiresActionProps;\n\ntype AdminPortalSsoConnectionProps = WidgetRootDomProps &\n AdminPortalSsoConnectionStatusProps & {\n currentDate: Date | null;\n lastSession: Date | null;\n adminPortalOpenButton: React.ReactNode;\n };\n\ninterface AdminPortalSsoConnectionContextValue {\n connectionStatus: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}\n\nconst AdminPortalSsoConnectionContext =\n React.createContext<AdminPortalSsoConnectionContextValue | null>(null);\nAdminPortalSsoConnectionContext.displayName = \"AdminPortalSsoConnectionContext\";\n\nfunction useAdminPortalSsoConnectionContext() {\n const context = React.useContext(AdminPortalSsoConnectionContext);\n if (!context) {\n throw new Error(\n \"useAdminPortalSsoConnectionContext must be used within a AdminPortalSsoConnectionContext provider\",\n );\n }\n return context;\n}\n\nconst AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps> = ({\n currentDate,\n connectionStatus,\n identityProvider,\n expiryDate,\n lastSession,\n adminPortalOpenButton,\n ...domProps\n}) => {\n return (\n <CardList.Root size=\"2\" {...getWidgetRootDomProps(\"resolved\", domProps)}>\n <AdminPortalSsoConnectionContext.Provider value={{ connectionStatus }}>\n <CardList.Item>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n {(() => {\n if (connectionStatus === \"NotConfigured\") {\n return (\n <>\n <Text size=\"2\" color=\"gray\">\n You haven’t set up Single Sign-On yet.\n </Text>\n {adminPortalOpenButton}\n </>\n );\n }\n\n return (\n <>\n <SessionInfo\n connectionStatus={connectionStatus}\n identityProvider={identityProvider}\n lastSession={lastSession}\n currentDate={currentDate}\n />\n <Flex gap=\"5\" align=\"center\">\n <SsoStatus status={connectionStatus} />\n {adminPortalOpenButton}\n </Flex>\n </>\n );\n })()}\n </Flex>\n </CardList.Item>\n {connectionStatus === \"Expired\" && (\n <CardList.Item>\n <Flex align=\"start\" gap=\"2\">\n <Box asChild mt=\"2px\" flexShrink=\"0\">\n <InfoCircledIcon color=\"gray\" />\n </Box>\n {(() => {\n if (connectionStatus === \"Expired\") {\n return (\n <Text size=\"2\" color=\"gray\">\n {(() => {\n if (!expiryDate) {\n return \"The SAML response signing certificate has expired\";\n }\n\n return (\n <>\n The SAML response signing certificate expired on{\" \"}\n <Text weight=\"bold\" as=\"span\">\n {expiryDate?.toLocaleString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </Text>\n </>\n );\n })()}\n . Users won’t be able to sign-in to the application until\n the certificate is renewed.\n </Text>\n );\n }\n\n if (connectionStatus === \"Expiring\") {\n return (\n <Text size=\"2\" color=\"gray\">\n {(() => {\n if (!expiryDate) {\n return \"The SAML response signing certificate is expiring soon\";\n }\n\n return (\n <>\n The SAML response signing certificate will expire on{\" \"}\n <Text weight=\"bold\" as=\"span\">\n {expiryDate?.toLocaleString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </Text>\n </>\n );\n })()}\n . When expired, users won’t be able to sign-in.\n </Text>\n );\n }\n })()}\n </Flex>\n </CardList.Item>\n )}\n </AdminPortalSsoConnectionContext.Provider>\n </CardList.Root>\n );\n};\n\nfunction SsoStatus({\n status,\n}: {\n status: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}) {\n if (status === \"NotConfigured\") {\n return null;\n }\n\n if (status === \"Inactive\") {\n return <Status state=\"waiting\">Setup in progress</Status>;\n }\n\n if (status === \"Expired\") {\n return <Status state=\"error\">Requires action</Status>;\n }\n\n if (status === \"Active\" || status === \"Expiring\") {\n return <Status state=\"success\">Connected</Status>;\n }\n\n return unreachable(status);\n}\n\nfunction SessionInfo({\n currentDate,\n identityProvider,\n lastSession,\n connectionStatus,\n}: {\n identityProvider: IdentityProvider;\n lastSession: Date | null;\n currentDate: Date | null;\n connectionStatus: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}) {\n const relativeTimeString = React.useMemo(() => {\n if (\n !lastSession ||\n !currentDate ||\n connectionStatus === \"NotConfigured\" ||\n connectionStatus === \"Inactive\"\n ) {\n return null;\n }\n\n return getRelativeTimeString(currentDate, lastSession);\n }, [lastSession, currentDate, connectionStatus]);\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color=\"panel\">\n <ProviderIcon provider={identityProvider} size=\"2\" />\n </IconPanel>\n {lastSession ? (\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {getIdentityProviderName(identityProvider)}\n </Text>\n {relativeTimeString ? (\n <Text color=\"gray\" size=\"2\">\n Last session {relativeTimeString}\n </Text>\n ) : null}\n </Flex>\n ) : (\n <Text size=\"2\" weight=\"bold\">\n {getIdentityProviderName(identityProvider)}\n </Text>\n )}\n </Flex>\n );\n}\n\nfunction AdminPortalOpenButton({\n isPending,\n href,\n initConfig,\n}: {\n isPending: boolean;\n href: string | null;\n initConfig: () => void;\n}) {\n const { connectionStatus } = useAdminPortalSsoConnectionContext();\n const label = (() => {\n switch (connectionStatus) {\n case \"NotConfigured\":\n return \"Set up SSO\";\n case \"Inactive\":\n return \"Continue setup\";\n case \"Active\":\n case \"Expiring\":\n case \"Expired\":\n return \"Manage\";\n default:\n return unreachable(connectionStatus);\n }\n })();\n\n if (href) {\n return (\n <Button variant=\"secondary\" asChild>\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {label} <ExternalLinkIcon aria-hidden />\n </a>\n </Button>\n );\n }\n\n return (\n <Button\n variant=\"secondary\"\n loading={isPending}\n disabled={isPending}\n onClick={initConfig}\n >\n {label} <ExternalLinkIcon aria-hidden />\n </Button>\n );\n}\n\ninterface AdminPortalSsoConnectionLoadingProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionLoading: React.FC<\n AdminPortalSsoConnectionLoadingProps\n> = (props) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel color=\"panel\">\n <ProviderIcon provider=\"okta\" size=\"2\" />\n </IconPanel>\n </Skeleton>\n <Flex direction=\"column\" gap=\"1\" my=\"-4px\">\n <Skeleton>\n <Text size=\"1\">Okta</Text>\n </Skeleton>\n <Skeleton>\n <Text size=\"1\">Last session 10 minutes ago</Text>\n </Skeleton>\n </Flex>\n </Flex>\n <Flex gap=\"5\" align=\"center\">\n <Skeleton>\n <Status state=\"error\">Requires action</Status>\n </Skeleton>\n <Skeleton>\n <Button variant=\"secondary\">\n Manage <ExternalLinkIcon aria-hidden />\n </Button>\n </Skeleton>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\ninterface AdminPortalSsoConnectionErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst AdminPortalSsoConnectionError: React.FC<\n AdminPortalSsoConnectionErrorProps\n> = ({ error, ...domProps }) => {\n React.useEffect(() => {\n console.error(error);\n }, [error]);\n\n const { heading, message } = getErrorMessage(error);\n\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Flex\n align=\"center\"\n justify=\"center\"\n width=\"24px\"\n height=\"24px\"\n style={{\n borderRadius: \"9999px\",\n backgroundColor: \"var(--red-a4)\",\n color: \"var(--red-a11)\",\n flexShrink: 0,\n }}\n >\n <Cross2Icon width=\"18px\" height=\"18px\" />\n </Flex>\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {heading}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {message}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\nfunction getRelativeTimeString(\n currentDate: Date | null,\n lastSession: Date | null,\n) {\n if (!currentDate || !lastSession) {\n return null;\n }\n\n const rtf = new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\" });\n const diff = lastSession.getTime() - currentDate.getTime();\n\n const diffSeconds = Math.round(diff / 1000);\n const diffMinutes = Math.round(diffSeconds / 60);\n const diffHours = Math.round(diffMinutes / 60);\n const diffDays = Math.round(diffHours / 24);\n const diffMonths = Math.round(diffDays / 30);\n const diffYears = Math.round(diffMonths / 12);\n\n if (Math.abs(diffSeconds) < 60) {\n return \"now\";\n }\n\n if (Math.abs(diffMinutes) < 60) {\n return rtf.format(diffMinutes, \"minute\");\n }\n\n if (Math.abs(diffHours) < 24) {\n return rtf.format(diffHours, \"hour\");\n }\n\n if (Math.abs(diffDays) < 30) {\n return rtf.format(diffDays, \"day\");\n }\n\n if (Math.abs(diffMonths) < 12) {\n return rtf.format(diffMonths, \"month\");\n }\n\n return rtf.format(diffYears, \"year\");\n}\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"admin-portal-sso-connection\",\n widgetState: state,\n });\n}\n\nexport type {\n AdminPortalSsoConnectionProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionErrorProps,\n};\nexport {\n AdminPortalSsoConnection,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnectionError,\n /** @internal */\n AdminPortalOpenButton,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/admin-portal-sso-connection.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Box, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { Button, Skeleton } from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport {\n ExternalLinkIcon,\n InfoCircledIcon,\n Cross2Icon,\n} from \"@radix-ui/react-icons\";\nimport * as CardList from \"./card-list.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n getIdentityProviderName,\n type IdentityProvider,\n} from \"./identity-providers.js\";\nimport { Status } from \"./status.js\";\nimport {\n getDomProps,\n unreachable,\n type WidgetRootState,\n type WidgetRootDomProps,\n} from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\nimport { getErrorMessage } from \"./generic-error.js\";\n\ninterface NotConfiguredProps {\n connectionStatus: \"NotConfigured\";\n identityProvider?: never;\n expiryDate?: never;\n}\n\ninterface InactiveProps {\n connectionStatus: \"Inactive\";\n identityProvider: IdentityProvider;\n expiryDate?: never;\n}\n\ninterface ActiveProps {\n connectionStatus: \"Active\";\n identityProvider: IdentityProvider;\n expiryDate?: never;\n}\n\ninterface RequiresActionProps {\n connectionStatus: \"Expired\" | \"Expiring\";\n identityProvider: IdentityProvider;\n expiryDate: Date | null;\n}\n\nexport type AdminPortalSsoConnectionStatusProps =\n | NotConfiguredProps\n | InactiveProps\n | ActiveProps\n | RequiresActionProps;\n\ntype AdminPortalSsoConnectionProps = WidgetRootDomProps &\n AdminPortalSsoConnectionStatusProps & {\n currentDate: Date | null;\n lastSession: Date | null;\n adminPortalOpenButton: React.ReactNode;\n };\n\ninterface AdminPortalSsoConnectionContextValue {\n connectionStatus: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}\n\nconst AdminPortalSsoConnectionContext =\n React.createContext<AdminPortalSsoConnectionContextValue | null>(null);\nAdminPortalSsoConnectionContext.displayName = \"AdminPortalSsoConnectionContext\";\n\nfunction useAdminPortalSsoConnectionContext() {\n const context = React.useContext(AdminPortalSsoConnectionContext);\n if (!context) {\n throw new Error(\n \"useAdminPortalSsoConnectionContext must be used within a AdminPortalSsoConnectionContext provider\",\n );\n }\n return context;\n}\n\nconst AdminPortalSsoConnection: React.FC<AdminPortalSsoConnectionProps> = ({\n currentDate,\n connectionStatus,\n identityProvider,\n expiryDate,\n lastSession,\n adminPortalOpenButton,\n ...domProps\n}) => {\n return (\n <CardList.Root size=\"2\" {...getWidgetRootDomProps(\"resolved\", domProps)}>\n <AdminPortalSsoConnectionContext.Provider value={{ connectionStatus }}>\n <CardList.Item>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n {(() => {\n if (connectionStatus === \"NotConfigured\") {\n return (\n <>\n <Text size=\"2\" color=\"gray\">\n <Translation\n defaultMessage=\"You haven't set up Single Sign-On yet.\"\n id=\"KDs1Ib\"\n description=\"Empty state message when SSO is not configured\"\n />\n </Text>\n {adminPortalOpenButton}\n </>\n );\n }\n\n return (\n <>\n <SessionInfo\n connectionStatus={connectionStatus}\n identityProvider={identityProvider}\n lastSession={lastSession}\n currentDate={currentDate}\n />\n <Flex gap=\"5\" align=\"center\">\n <SsoStatus status={connectionStatus} />\n {adminPortalOpenButton}\n </Flex>\n </>\n );\n })()}\n </Flex>\n </CardList.Item>\n {connectionStatus === \"Expired\" && (\n <CardList.Item>\n <Flex align=\"start\" gap=\"2\">\n <Box asChild mt=\"2px\" flexShrink=\"0\">\n <InfoCircledIcon color=\"gray\" />\n </Box>\n {(() => {\n if (connectionStatus === \"Expired\") {\n return (\n <Text size=\"2\" color=\"gray\">\n {(() => {\n if (!expiryDate) {\n return (\n <Translation\n defaultMessage=\"The SAML response signing certificate has expired. Users won't be able to sign-in to the application until the certificate is renewed.\"\n id=\"5tX19v\"\n description=\"Error message when SAML certificate has expired (no date)\"\n />\n );\n }\n\n return (\n <Translation\n defaultMessage=\"The SAML response signing certificate expired on {expiryDate}. Users won't be able to sign-in to the application until the certificate is renewed.\"\n id=\"vmTW/h\"\n description=\"Error message when SAML certificate has expired with date\"\n values={{\n expiryDate: (\n <Text weight=\"bold\" as=\"span\">\n {expiryDate?.toLocaleString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </Text>\n ),\n }}\n />\n );\n })()}\n </Text>\n );\n }\n\n if (connectionStatus === \"Expiring\") {\n return (\n <Text size=\"2\" color=\"gray\">\n {(() => {\n if (!expiryDate) {\n return (\n <Translation\n defaultMessage=\"The SAML response signing certificate is expiring soon. When expired, users won't be able to sign-in.\"\n id=\"3dgA5f\"\n description=\"Warning message when SAML certificate is expiring soon (no date)\"\n />\n );\n }\n\n return (\n <Translation\n defaultMessage=\"The SAML response signing certificate will expire on {expiryDate}. When expired, users won't be able to sign-in.\"\n id=\"xT9Exy\"\n description=\"Warning message when SAML certificate is expiring with date\"\n values={{\n expiryDate: (\n <Text weight=\"bold\" as=\"span\">\n {expiryDate?.toLocaleString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n })}\n </Text>\n ),\n }}\n />\n );\n })()}\n </Text>\n );\n }\n })()}\n </Flex>\n </CardList.Item>\n )}\n </AdminPortalSsoConnectionContext.Provider>\n </CardList.Root>\n );\n};\n\nfunction SsoStatus({\n status,\n}: {\n status: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}) {\n if (status === \"NotConfigured\") {\n return null;\n }\n\n if (status === \"Inactive\") {\n return (\n <Status state=\"waiting\">\n <Translation\n defaultMessage=\"Setup in progress\"\n id=\"MQR5mR\"\n description=\"Status label when SSO setup is incomplete\"\n />\n </Status>\n );\n }\n\n if (status === \"Expired\") {\n return (\n <Status state=\"error\">\n <Translation\n defaultMessage=\"Requires action\"\n id=\"Yo2vHC\"\n description=\"Status label when SSO requires attention\"\n />\n </Status>\n );\n }\n\n if (status === \"Active\" || status === \"Expiring\") {\n return (\n <Status state=\"success\">\n <Translation\n defaultMessage=\"Connected\"\n id=\"8S+Cyw\"\n description=\"Status label when SSO is active\"\n />\n </Status>\n );\n }\n\n return unreachable(status);\n}\n\nfunction SessionInfo({\n currentDate,\n identityProvider,\n lastSession,\n connectionStatus,\n}: {\n identityProvider: IdentityProvider;\n lastSession: Date | null;\n currentDate: Date | null;\n connectionStatus: AdminPortalSsoConnectionStatusProps[\"connectionStatus\"];\n}) {\n const relativeTimeString = React.useMemo(() => {\n if (\n !lastSession ||\n !currentDate ||\n connectionStatus === \"NotConfigured\" ||\n connectionStatus === \"Inactive\"\n ) {\n return null;\n }\n\n return getRelativeTimeString(currentDate, lastSession);\n }, [lastSession, currentDate, connectionStatus]);\n\n return (\n <Flex gap=\"4\" align=\"center\">\n <IconPanel color=\"panel\">\n <ProviderIcon provider={identityProvider} size=\"2\" />\n </IconPanel>\n {lastSession ? (\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {getIdentityProviderName(identityProvider)}\n </Text>\n {relativeTimeString ? (\n <Text color=\"gray\" size=\"2\">\n <Translation\n defaultMessage=\"Last session {relativeTime}\"\n id=\"yN72Gc\"\n description=\"Label showing when the last SSO session occurred\"\n values={{ relativeTime: relativeTimeString }}\n />\n </Text>\n ) : null}\n </Flex>\n ) : (\n <Text size=\"2\" weight=\"bold\">\n {getIdentityProviderName(identityProvider)}\n </Text>\n )}\n </Flex>\n );\n}\n\nfunction AdminPortalOpenButton({\n isPending,\n href,\n initConfig,\n}: {\n isPending: boolean;\n href: string | null;\n initConfig: () => void;\n}) {\n const { connectionStatus } = useAdminPortalSsoConnectionContext();\n const label = (() => {\n switch (connectionStatus) {\n case \"NotConfigured\":\n return (\n <Translation\n defaultMessage=\"Set up SSO\"\n id=\"MtkNQO\"\n description=\"Button label to start SSO setup\"\n />\n );\n case \"Inactive\":\n return (\n <Translation\n defaultMessage=\"Continue setup\"\n id=\"HFxrbY\"\n description=\"Button label to continue incomplete SSO setup\"\n />\n );\n case \"Active\":\n case \"Expiring\":\n case \"Expired\":\n return (\n <Translation\n defaultMessage=\"Manage\"\n id=\"T1VKzP\"\n description=\"Button label to manage SSO settings\"\n />\n );\n default:\n return unreachable(connectionStatus);\n }\n })();\n\n if (href) {\n return (\n <Button variant=\"secondary\" asChild>\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {label} <ExternalLinkIcon aria-hidden />\n </a>\n </Button>\n );\n }\n\n return (\n <Button\n variant=\"secondary\"\n loading={isPending}\n disabled={isPending}\n onClick={initConfig}\n >\n {label} <ExternalLinkIcon aria-hidden />\n </Button>\n );\n}\n\ninterface AdminPortalSsoConnectionLoadingProps extends WidgetRootDomProps {}\n\nconst AdminPortalSsoConnectionLoading: React.FC<\n AdminPortalSsoConnectionLoadingProps\n> = (props) => {\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"loading\", props)}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Skeleton>\n <IconPanel color=\"panel\">\n <ProviderIcon provider=\"okta\" size=\"2\" />\n </IconPanel>\n </Skeleton>\n <Flex direction=\"column\" gap=\"1\" my=\"-4px\">\n <Skeleton>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <Text size=\"1\">Okta</Text>\n </Skeleton>\n <Skeleton>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <Text size=\"1\">Last session 10 minutes ago</Text>\n </Skeleton>\n </Flex>\n </Flex>\n <Flex gap=\"5\" align=\"center\">\n <Skeleton>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <Status state=\"error\">Requires action</Status>\n </Skeleton>\n <Skeleton>\n {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}\n <Button variant=\"secondary\">\n Manage <ExternalLinkIcon aria-hidden />\n </Button>\n </Skeleton>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\ninterface AdminPortalSsoConnectionErrorProps extends WidgetRootDomProps {\n error: unknown;\n}\n\nconst AdminPortalSsoConnectionError: React.FC<\n AdminPortalSsoConnectionErrorProps\n> = ({ error, ...domProps }) => {\n const translate = useTranslation();\n React.useEffect(() => {\n console.error(error);\n }, [error]);\n\n const { heading, message } = getErrorMessage(error, translate);\n\n return (\n <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n <Flex gap=\"4\" align=\"center\">\n <Flex\n align=\"center\"\n justify=\"center\"\n width=\"24px\"\n height=\"24px\"\n style={{\n borderRadius: \"9999px\",\n backgroundColor: \"var(--red-a4)\",\n color: \"var(--red-a11)\",\n flexShrink: 0,\n }}\n >\n <Cross2Icon width=\"18px\" height=\"18px\" />\n </Flex>\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {heading}\n </Text>\n <Text size=\"2\" color=\"gray\">\n {message}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Card>\n );\n};\n\nfunction getRelativeTimeString(\n currentDate: Date | null,\n lastSession: Date | null,\n) {\n if (!currentDate || !lastSession) {\n return null;\n }\n\n const rtf = new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\" });\n const diff = lastSession.getTime() - currentDate.getTime();\n\n const diffSeconds = Math.round(diff / 1000);\n const diffMinutes = Math.round(diffSeconds / 60);\n const diffHours = Math.round(diffMinutes / 60);\n const diffDays = Math.round(diffHours / 24);\n const diffMonths = Math.round(diffDays / 30);\n const diffYears = Math.round(diffMonths / 12);\n\n if (Math.abs(diffSeconds) < 60) {\n return \"now\";\n }\n\n if (Math.abs(diffMinutes) < 60) {\n return rtf.format(diffMinutes, \"minute\");\n }\n\n if (Math.abs(diffHours) < 24) {\n return rtf.format(diffHours, \"hour\");\n }\n\n if (Math.abs(diffDays) < 30) {\n return rtf.format(diffDays, \"day\");\n }\n\n if (Math.abs(diffMonths) < 12) {\n return rtf.format(diffMonths, \"month\");\n }\n\n return rtf.format(diffYears, \"year\");\n}\n\nfunction getWidgetRootDomProps(\n state: WidgetRootState,\n domProps: WidgetRootDomProps,\n) {\n return getDomProps({\n ...domProps,\n isWidgetRoot: true,\n widgetId: \"admin-portal-sso-connection\",\n widgetState: state,\n });\n}\n\nexport type {\n AdminPortalSsoConnectionProps,\n AdminPortalSsoConnectionLoadingProps,\n AdminPortalSsoConnectionErrorProps,\n};\nexport {\n AdminPortalSsoConnection,\n AdminPortalSsoConnectionLoading,\n AdminPortalSsoConnectionError,\n /** @internal */\n AdminPortalOpenButton,\n};\n"],"mappings":"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","names":[]}
@@ -24,21 +24,43 @@ module.exports = __toCommonJS(api_key_details_card_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_themes = require("@radix-ui/themes");
26
26
  var import_relative_time = require("./relative-time.js");
27
+ var import_translation = require("../i18n/translation.js");
27
28
  function ApiKeyDetailsCard({
28
29
  apiKey,
29
30
  ...cardProps
30
31
  }) {
31
32
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Card, { size: "2", ...cardProps, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.DataList.Root, { children: [
32
33
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.DataList.Item, { children: [
33
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: "Name" }),
34
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
35
+ import_translation.Translation,
36
+ {
37
+ defaultMessage: "Name",
38
+ id: "tuCHkH",
39
+ description: "Label for API key name field"
40
+ }
41
+ ) }),
34
42
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Value, { children: apiKey.name })
35
43
  ] }),
36
44
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.DataList.Item, { children: [
37
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: "Value" }),
45
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
46
+ import_translation.Translation,
47
+ {
48
+ defaultMessage: "Value",
49
+ id: "HnuClZ",
50
+ description: "Label for API key value field"
51
+ }
52
+ ) }),
38
53
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Value, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Code, { color: "gray", children: apiKey.obfuscatedValue }) })
39
54
  ] }),
40
55
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.DataList.Item, { children: [
41
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: "Last used" }),
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.DataList.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
57
+ import_translation.Translation,
58
+ {
59
+ defaultMessage: "Last used",
60
+ id: "elg/zm",
61
+ description: "Label for API key last used timestamp"
62
+ }
63
+ ) }),
42
64
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
43
65
  import_themes.DataList.Value,
44
66
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/api-key-details-card.tsx"],"sourcesContent":["import { DataList, Card, Code, CardProps } from \"@radix-ui/themes\";\nimport { RelativeTime } from \"./relative-time.js\";\nimport { ListOrganizationApiKeysResponseData } from \"../../api/endpoint.js\";\n\nexport function ApiKeyDetailsCard({\n apiKey,\n ...cardProps\n}: { apiKey: ListOrganizationApiKeysResponseData } & CardProps) {\n return (\n <Card size=\"2\" {...cardProps}>\n <DataList.Root>\n <DataList.Item>\n <DataList.Label>Name</DataList.Label>\n <DataList.Value>{apiKey.name}</DataList.Value>\n </DataList.Item>\n <DataList.Item>\n <DataList.Label>Value</DataList.Label>\n <DataList.Value>\n <Code color=\"gray\">{apiKey.obfuscatedValue}</Code>\n </DataList.Value>\n </DataList.Item>\n <DataList.Item>\n <DataList.Label>Last used</DataList.Label>\n <DataList.Value\n style={apiKey.lastUsedAt ? undefined : { color: \"var(--gray-10)\" }}\n >\n <RelativeTime\n date={apiKey.lastUsedAt ? new Date(apiKey.lastUsedAt) : undefined}\n />\n </DataList.Value>\n </DataList.Item>\n </DataList.Root>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAWQ;AAXR,oBAAgD;AAChD,2BAA6B;AAGtB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,GAAG;AACL,GAAgE;AAC9D,SACE,4CAAC,sBAAK,MAAK,KAAK,GAAG,WACjB,uDAAC,uBAAS,MAAT,EACC;AAAA,iDAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EAAe,kBAAI;AAAA,MACpB,4CAAC,uBAAS,OAAT,EAAgB,iBAAO,MAAK;AAAA,OAC/B;AAAA,IACA,6CAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EAAe,mBAAK;AAAA,MACrB,4CAAC,uBAAS,OAAT,EACC,sDAAC,sBAAK,OAAM,QAAQ,iBAAO,iBAAgB,GAC7C;AAAA,OACF;AAAA,IACA,6CAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EAAe,uBAAS;AAAA,MACzB;AAAA,QAAC,uBAAS;AAAA,QAAT;AAAA,UACC,OAAO,OAAO,aAAa,SAAY,EAAE,OAAO,iBAAiB;AAAA,UAEjE;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,OAAO,aAAa,IAAI,KAAK,OAAO,UAAU,IAAI;AAAA;AAAA,UAC1D;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/api-key-details-card.tsx"],"sourcesContent":["import { DataList, Card, Code, CardProps } from \"@radix-ui/themes\";\nimport { RelativeTime } from \"./relative-time.js\";\nimport { ListOrganizationApiKeysResponseData } from \"../../api/endpoint.js\";\nimport { Translation } from \"../i18n/translation.js\";\n\nexport function ApiKeyDetailsCard({\n apiKey,\n ...cardProps\n}: { apiKey: ListOrganizationApiKeysResponseData } & CardProps) {\n return (\n <Card size=\"2\" {...cardProps}>\n <DataList.Root>\n <DataList.Item>\n <DataList.Label>\n <Translation\n defaultMessage=\"Name\"\n id=\"tuCHkH\"\n description=\"Label for API key name field\"\n />\n </DataList.Label>\n <DataList.Value>{apiKey.name}</DataList.Value>\n </DataList.Item>\n <DataList.Item>\n <DataList.Label>\n <Translation\n defaultMessage=\"Value\"\n id=\"HnuClZ\"\n description=\"Label for API key value field\"\n />\n </DataList.Label>\n <DataList.Value>\n <Code color=\"gray\">{apiKey.obfuscatedValue}</Code>\n </DataList.Value>\n </DataList.Item>\n <DataList.Item>\n <DataList.Label>\n <Translation\n defaultMessage=\"Last used\"\n id=\"elg/zm\"\n description=\"Label for API key last used timestamp\"\n />\n </DataList.Label>\n <DataList.Value\n style={apiKey.lastUsedAt ? undefined : { color: \"var(--gray-10)\" }}\n >\n <RelativeTime\n date={apiKey.lastUsedAt ? new Date(apiKey.lastUsedAt) : undefined}\n />\n </DataList.Value>\n </DataList.Item>\n </DataList.Root>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAYQ;AAZR,oBAAgD;AAChD,2BAA6B;AAE7B,yBAA4B;AAErB,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,GAAG;AACL,GAAgE;AAC9D,SACE,4CAAC,sBAAK,MAAK,KAAK,GAAG,WACjB,uDAAC,uBAAS,MAAT,EACC;AAAA,iDAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA,4CAAC,uBAAS,OAAT,EAAgB,iBAAO,MAAK;AAAA,OAC/B;AAAA,IACA,6CAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA,4CAAC,uBAAS,OAAT,EACC,sDAAC,sBAAK,OAAM,QAAQ,iBAAO,iBAAgB,GAC7C;AAAA,OACF;AAAA,IACA,6CAAC,uBAAS,MAAT,EACC;AAAA,kDAAC,uBAAS,OAAT,EACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA;AAAA,QAAC,uBAAS;AAAA,QAAT;AAAA,UACC,OAAO,OAAO,aAAa,SAAY,EAAE,OAAO,iBAAiB;AAAA,UAEjE;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,OAAO,aAAa,IAAI,KAAK,OAAO,UAAU,IAAI;AAAA;AAAA,UAC1D;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -26,6 +26,7 @@ var import_themes = require("@radix-ui/themes");
26
26
  var import_elements = require("../elements.js");
27
27
  var import_api_key_details_card = require("./api-key-details-card.js");
28
28
  var import_endpoint = require("../../api/endpoint.js");
29
+ var import_translation = require("../i18n/translation.js");
29
30
  function Permission({
30
31
  ...permission
31
32
  }) {
@@ -45,11 +46,25 @@ function ApiKeyDetailsDialog({
45
46
  (permission) => permissionsQuery.data?.data.find((p) => p.slug === permission)
46
47
  );
47
48
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Dialog.Content, { maxWidth: "529px", children: [
48
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children: "API key details" }),
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50
+ import_translation.Translation,
51
+ {
52
+ defaultMessage: "API key details",
53
+ id: "dqU4kt",
54
+ description: "Dialog title for viewing API key details"
55
+ }
56
+ ) }),
49
57
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "5", children: [
50
58
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_api_key_details_card.ApiKeyDetailsCard, { apiKey, mt: "5" }),
51
59
  permissions.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { direction: "column", gap: "2", children: [
52
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: "Permissions" }),
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Label, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
+ import_translation.Translation,
62
+ {
63
+ defaultMessage: "Permissions",
64
+ id: "i0XUeg",
65
+ description: "Label for API key permissions section"
66
+ }
67
+ ) }),
53
68
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
69
  import_themes.Flex,
55
70
  {
@@ -69,7 +84,14 @@ function ApiKeyDetailsDialog({
69
84
  )
70
85
  ] }) : null
71
86
  ] }),
72
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { align: "center", gap: "3", justify: "end", mt: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: "Close" }) }) })
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { align: "center", gap: "3", justify: "end", mt: "5", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Dialog.Close, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
88
+ import_translation.Translation,
89
+ {
90
+ defaultMessage: "Close",
91
+ id: "/4YwoE",
92
+ description: "Button to close the API key details dialog"
93
+ }
94
+ ) }) }) })
73
95
  ] }) });
74
96
  }
75
97
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/api-key-details-dialog.tsx"],"sourcesContent":["import { Flex, Box, Text, ScrollArea } from \"@radix-ui/themes\";\nimport { Button, Dialog, Label } from \"../elements.js\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n ListOrganizationApiKeysResponseData,\n useListOrganizationApiKeyPermissions,\n} from \"../../api/endpoint.js\";\n\nfunction Permission({\n ...permission\n}: {\n name: string;\n description?: string | null;\n}) {\n return (\n <Box className=\"woswidgets-api-key-details-permission\" px=\"4\" py=\"3\">\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n {permission.description ? (\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n ) : null}\n </Flex>\n </Box>\n );\n}\n\nexport function ApiKeyDetailsDialog({\n open,\n onOpenChange,\n apiKey,\n permissions,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n apiKey: ListOrganizationApiKeysResponseData;\n permissions: string[];\n}) {\n const permissionsQuery = useListOrganizationApiKeyPermissions({ limit: 100 });\n const filteredPermissions = permissions.map((permission) =>\n permissionsQuery.data?.data.find((p) => p.slug === permission),\n );\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title>API key details</Dialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <ApiKeyDetailsCard apiKey={apiKey} mt=\"5\" />\n {permissions.length ? (\n <Flex direction=\"column\" gap=\"2\">\n <Label>Permissions</Label>\n <Flex\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 <ScrollArea style={{ maxHeight: \"calc(50vh - 150px)\" }}>\n {filteredPermissions.map((permission) => {\n if (!permission) return null;\n return <Permission key={permission.name} {...permission} />;\n })}\n </ScrollArea>\n </Flex>\n </Flex>\n ) : null}\n </Flex>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\">Close</Button>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBM;AAhBN,oBAA4C;AAC5C,sBAAsC;AACtC,kCAAkC;AAClC,sBAGO;AAEP,SAAS,WAAW;AAAA,EAClB,GAAG;AACL,GAGG;AACD,SACE,4CAAC,qBAAI,WAAU,yCAAwC,IAAG,KAAI,IAAG,KAC/D,uDAAC,sBAAK,WAAU,UACd;AAAA,gDAAC,sBAAK,MAAK,KAAI,QAAO,QACnB,qBAAW,MACd;AAAA,IACC,WAAW,cACV,4CAAC,sBAAK,MAAK,KAAI,OAAM,QAClB,qBAAW,aACd,IACE;AAAA,KACN,GACF;AAEJ;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,uBAAmB,sDAAqC,EAAE,OAAO,IAAI,CAAC;AAC5E,QAAM,sBAAsB,YAAY;AAAA,IAAI,CAAC,eAC3C,iBAAiB,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,EAC/D;AAEA,SACE,4CAAC,uBAAO,MAAP,EAAY,MAAY,cACvB,uDAAC,uBAAO,SAAP,EAAe,UAAS,SACvB;AAAA,gDAAC,uBAAO,OAAP,EAAa,6BAAe;AAAA,IAC7B,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,kDAAC,iDAAkB,QAAgB,IAAG,KAAI;AAAA,MACzC,YAAY,SACX,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,oDAAC,yBAAM,yBAAW;AAAA,QAClB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,cAAc;AAAA,cACd,aAAa;AAAA,cACb,aAAa;AAAA,cACb,aAAa;AAAA,YACf;AAAA,YACA,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,sDAAC,4BAAW,OAAO,EAAE,WAAW,qBAAqB,GAClD,8BAAoB,IAAI,CAAC,eAAe;AACvC,kBAAI,CAAC,WAAY,QAAO;AACxB,qBAAO,4CAAC,cAAkC,GAAG,cAArB,WAAW,IAAsB;AAAA,YAC3D,CAAC,GACH;AAAA;AAAA,QACF;AAAA,SACF,IACE;AAAA,OACN;AAAA,IACA,4CAAC,sBAAK,OAAM,UAAS,KAAI,KAAI,SAAQ,OAAM,IAAG,KAC5C,sDAAC,uBAAO,OAAP,EACC,sDAAC,0BAAO,SAAQ,aAAY,mBAAK,GACnC,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/api-key-details-dialog.tsx"],"sourcesContent":["import { Flex, Box, Text, ScrollArea } from \"@radix-ui/themes\";\nimport { Button, Dialog, Label } from \"../elements.js\";\nimport { ApiKeyDetailsCard } from \"./api-key-details-card.js\";\nimport {\n ListOrganizationApiKeysResponseData,\n useListOrganizationApiKeyPermissions,\n} from \"../../api/endpoint.js\";\nimport { Translation } from \"../i18n/translation.js\";\n\nfunction Permission({\n ...permission\n}: {\n name: string;\n description?: string | null;\n}) {\n return (\n <Box className=\"woswidgets-api-key-details-permission\" px=\"4\" py=\"3\">\n <Flex direction=\"column\">\n <Text size=\"2\" weight=\"bold\">\n {permission.name}\n </Text>\n {permission.description ? (\n <Text size=\"2\" color=\"gray\">\n {permission.description}\n </Text>\n ) : null}\n </Flex>\n </Box>\n );\n}\n\nexport function ApiKeyDetailsDialog({\n open,\n onOpenChange,\n apiKey,\n permissions,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n apiKey: ListOrganizationApiKeysResponseData;\n permissions: string[];\n}) {\n const permissionsQuery = useListOrganizationApiKeyPermissions({ limit: 100 });\n const filteredPermissions = permissions.map((permission) =>\n permissionsQuery.data?.data.find((p) => p.slug === permission),\n );\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content maxWidth=\"529px\">\n <Dialog.Title>\n <Translation\n defaultMessage=\"API key details\"\n id=\"dqU4kt\"\n description=\"Dialog title for viewing API key details\"\n />\n </Dialog.Title>\n <Flex direction=\"column\" gap=\"5\">\n <ApiKeyDetailsCard apiKey={apiKey} mt=\"5\" />\n {permissions.length ? (\n <Flex direction=\"column\" gap=\"2\">\n <Label>\n <Translation\n defaultMessage=\"Permissions\"\n id=\"i0XUeg\"\n description=\"Label for API key permissions section\"\n />\n </Label>\n <Flex\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 <ScrollArea style={{ maxHeight: \"calc(50vh - 150px)\" }}>\n {filteredPermissions.map((permission) => {\n if (!permission) return null;\n return <Permission key={permission.name} {...permission} />;\n })}\n </ScrollArea>\n </Flex>\n </Flex>\n ) : null}\n </Flex>\n <Flex align=\"center\" gap=\"3\" justify=\"end\" mt=\"5\">\n <Dialog.Close>\n <Button variant=\"secondary\">\n <Translation\n defaultMessage=\"Close\"\n id=\"/4YwoE\"\n description=\"Button to close the API key details dialog\"\n />\n </Button>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBM;AAjBN,oBAA4C;AAC5C,sBAAsC;AACtC,kCAAkC;AAClC,sBAGO;AACP,yBAA4B;AAE5B,SAAS,WAAW;AAAA,EAClB,GAAG;AACL,GAGG;AACD,SACE,4CAAC,qBAAI,WAAU,yCAAwC,IAAG,KAAI,IAAG,KAC/D,uDAAC,sBAAK,WAAU,UACd;AAAA,gDAAC,sBAAK,MAAK,KAAI,QAAO,QACnB,qBAAW,MACd;AAAA,IACC,WAAW,cACV,4CAAC,sBAAK,MAAK,KAAI,OAAM,QAClB,qBAAW,aACd,IACE;AAAA,KACN,GACF;AAEJ;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,uBAAmB,sDAAqC,EAAE,OAAO,IAAI,CAAC;AAC5E,QAAM,sBAAsB,YAAY;AAAA,IAAI,CAAC,eAC3C,iBAAiB,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,EAC/D;AAEA,SACE,4CAAC,uBAAO,MAAP,EAAY,MAAY,cACvB,uDAAC,uBAAO,SAAP,EAAe,UAAS,SACvB;AAAA,gDAAC,uBAAO,OAAP,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,kDAAC,iDAAkB,QAAgB,IAAG,KAAI;AAAA,MACzC,YAAY,SACX,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,oDAAC,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,cAAc;AAAA,cACd,aAAa;AAAA,cACb,aAAa;AAAA,cACb,aAAa;AAAA,YACf;AAAA,YACA,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,sDAAC,4BAAW,OAAO,EAAE,WAAW,qBAAqB,GAClD,8BAAoB,IAAI,CAAC,eAAe;AACvC,kBAAI,CAAC,WAAY,QAAO;AACxB,qBAAO,4CAAC,cAAkC,GAAG,cAArB,WAAW,IAAsB;AAAA,YAC3D,CAAC,GACH;AAAA;AAAA,QACF;AAAA,SACF,IACE;AAAA,OACN;AAAA,IACA,4CAAC,sBAAK,OAAM,UAAS,KAAI,KAAI,SAAQ,OAAM,IAAG,KAC5C,sDAAC,uBAAO,OAAP,EACC,sDAAC,0BAAO,SAAQ,aACd;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF,GACF,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -42,9 +42,11 @@ var import_elements = require("../elements.js");
42
42
  var import_api_keys_search_provider = require("./api-keys-search-provider.js");
43
43
  var import_api_keys_context = require("./api-keys-context.js");
44
44
  var import_utils = require("../utils.js");
45
+ var import_use_translation = require("../i18n/use-translation.js");
45
46
  const ApiKeysSearch = React.forwardRef(({ className, ...props }, ref) => {
46
47
  const { inputRef, clearSearch, searchValue, setSearchValue } = (0, import_api_keys_search_provider.useApiKeysSearchContext)();
47
48
  const { dispatch } = (0, import_api_keys_context.useApiKeysContext)();
49
+ const translate = (0, import_use_translation.useTranslation)();
48
50
  const filter = (0, import_use_debounce.useDebouncedCallback)((value) => {
49
51
  dispatch({ type: "FILTER_BY_SEARCH", searchQuery: value });
50
52
  }, 200);
@@ -58,7 +60,11 @@ const ApiKeysSearch = React.forwardRef(({ className, ...props }, ref) => {
58
60
  ref: (0, import_react_compose_refs.useComposedRefs)(inputRef, ref),
59
61
  className: (0, import_clsx.default)((0, import_utils.namespaceClassNames)("api-keys-search"), className),
60
62
  autoComplete: "off",
61
- placeholder: "Search by name",
63
+ placeholder: translate({
64
+ defaultMessage: "Search by name",
65
+ id: "GC8aGI",
66
+ description: "Placeholder for API key search input"
67
+ }),
62
68
  value: searchValue,
63
69
  onChange: (event) => {
64
70
  const value = event.target.value;
@@ -74,13 +80,16 @@ const ApiKeysSearch = React.forwardRef(({ className, ...props }, ref) => {
74
80
  ...props,
75
81
  children: [
76
82
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextFieldSlot, { side: "left", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.MagnifyingGlassIcon, { "aria-hidden": "true", height: "16", width: "16" }) }),
77
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextFieldSlot, { side: "right", children: searchValue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
83
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextFieldSlot, { side: "right", children: !!searchValue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
78
84
  import_elements.IconButton,
79
85
  {
80
86
  size: "1",
81
87
  onClick: resetSearch,
82
- title: "Clear search",
83
- "aria-label": "Clear search",
88
+ title: translate({
89
+ defaultMessage: "Clear search",
90
+ id: "7enwzK",
91
+ description: "Title tooltip for clear search button"
92
+ }),
84
93
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.Cross2Icon, { "aria-hidden": "true" })
85
94
  }
86
95
  ) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api-keys/api-keys-search.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Cross2Icon, MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport cx from \"clsx\";\nimport * as React from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { IconButton, TextField, TextFieldSlot } from \"../elements.js\";\nimport { useApiKeysSearchContext } from \"./api-keys-search-provider.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\nimport { namespaceClassNames } from \"../utils.js\";\n\ntype ApiKeysSearchProps = React.ComponentPropsWithoutRef<typeof TextField>;\n\nexport const ApiKeysSearch = React.forwardRef<\n HTMLInputElement,\n ApiKeysSearchProps\n>(({ className, ...props }, ref) => {\n const { inputRef, clearSearch, searchValue, setSearchValue } =\n useApiKeysSearchContext();\n const { dispatch } = useApiKeysContext();\n\n const filter = useDebouncedCallback((value) => {\n dispatch({ type: \"FILTER_BY_SEARCH\", searchQuery: value });\n }, 200);\n\n const resetSearch = () => {\n clearSearch();\n filter.cancel();\n };\n\n return (\n <TextField\n ref={useComposedRefs(inputRef, ref)}\n className={cx(namespaceClassNames(\"api-keys-search\"), className)}\n autoComplete=\"off\"\n placeholder=\"Search by name\"\n value={searchValue}\n onChange={(event) => {\n const value = event.target.value;\n setSearchValue(value);\n filter(value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n resetSearch();\n }\n }}\n {...props}\n >\n <TextFieldSlot side=\"left\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n\n <TextFieldSlot side=\"right\">\n {searchValue && (\n <IconButton\n size=\"1\"\n onClick={resetSearch}\n title=\"Clear search\"\n aria-label=\"Clear search\"\n >\n <Cross2Icon aria-hidden=\"true\" />\n </IconButton>\n )}\n </TextFieldSlot>\n </TextField>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCI;AA9BJ,gCAAgC;AAChC,yBAAgD;AAChD,kBAAe;AACf,YAAuB;AACvB,0BAAqC;AACrC,sBAAqD;AACrD,sCAAwC;AACxC,8BAAkC;AAClC,mBAAoC;AAI7B,MAAM,gBAAgB,MAAM,WAGjC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,EAAE,UAAU,aAAa,aAAa,eAAe,QACzD,yDAAwB;AAC1B,QAAM,EAAE,SAAS,QAAI,2CAAkB;AAEvC,QAAM,aAAS,0CAAqB,CAAC,UAAU;AAC7C,aAAS,EAAE,MAAM,oBAAoB,aAAa,MAAM,CAAC;AAAA,EAC3D,GAAG,GAAG;AAEN,QAAM,cAAc,MAAM;AACxB,gBAAY;AACZ,WAAO,OAAO;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAK,2CAAgB,UAAU,GAAG;AAAA,MAClC,eAAW,YAAAA,aAAG,kCAAoB,iBAAiB,GAAG,SAAS;AAAA,MAC/D,cAAa;AAAA,MACb,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU,CAAC,UAAU;AACnB,cAAM,QAAQ,MAAM,OAAO;AAC3B,uBAAe,KAAK;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,YAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAM,eAAe;AACrB,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,oDAAC,iCAAc,MAAK,QAClB,sDAAC,0CAAoB,eAAY,QAAO,QAAO,MAAK,OAAM,MAAK,GACjE;AAAA,QAEA,4CAAC,iCAAc,MAAK,SACjB,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YACN,cAAW;AAAA,YAEX,sDAAC,iCAAW,eAAY,QAAO;AAAA;AAAA,QACjC,GAEJ;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["cx"]}
1
+ {"version":3,"sources":["../../../../src/lib/api-keys/api-keys-search.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Cross2Icon, MagnifyingGlassIcon } from \"@radix-ui/react-icons\";\nimport cx from \"clsx\";\nimport * as React from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { IconButton, TextField, TextFieldSlot } from \"../elements.js\";\nimport { useApiKeysSearchContext } from \"./api-keys-search-provider.js\";\nimport { useApiKeysContext } from \"./api-keys-context.js\";\nimport { namespaceClassNames } from \"../utils.js\";\nimport { useTranslation } from \"../i18n/use-translation.js\";\n\ntype ApiKeysSearchProps = React.ComponentPropsWithoutRef<typeof TextField>;\n\nexport const ApiKeysSearch = React.forwardRef<\n HTMLInputElement,\n ApiKeysSearchProps\n>(({ className, ...props }, ref) => {\n const { inputRef, clearSearch, searchValue, setSearchValue } =\n useApiKeysSearchContext();\n const { dispatch } = useApiKeysContext();\n const translate = useTranslation();\n\n const filter = useDebouncedCallback((value) => {\n dispatch({ type: \"FILTER_BY_SEARCH\", searchQuery: value });\n }, 200);\n\n const resetSearch = () => {\n clearSearch();\n filter.cancel();\n };\n\n return (\n <TextField\n ref={useComposedRefs(inputRef, ref)}\n className={cx(namespaceClassNames(\"api-keys-search\"), className)}\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"Search by name\",\n id: \"GC8aGI\",\n description: \"Placeholder for API key search input\",\n })}\n value={searchValue}\n onChange={(event) => {\n const value = event.target.value;\n setSearchValue(value);\n filter(value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n resetSearch();\n }\n }}\n {...props}\n >\n <TextFieldSlot side=\"left\">\n <MagnifyingGlassIcon aria-hidden=\"true\" height=\"16\" width=\"16\" />\n </TextFieldSlot>\n\n <TextFieldSlot side=\"right\">\n {!!searchValue && (\n <IconButton\n size=\"1\"\n onClick={resetSearch}\n title={translate({\n defaultMessage: \"Clear search\",\n id: \"7enwzK\",\n description: \"Title tooltip for clear search button\",\n })}\n >\n <Cross2Icon aria-hidden=\"true\" />\n </IconButton>\n )}\n </TextFieldSlot>\n </TextField>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCI;AAhCJ,gCAAgC;AAChC,yBAAgD;AAChD,kBAAe;AACf,YAAuB;AACvB,0BAAqC;AACrC,sBAAqD;AACrD,sCAAwC;AACxC,8BAAkC;AAClC,mBAAoC;AACpC,6BAA+B;AAIxB,MAAM,gBAAgB,MAAM,WAGjC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,QAAM,EAAE,UAAU,aAAa,aAAa,eAAe,QACzD,yDAAwB;AAC1B,QAAM,EAAE,SAAS,QAAI,2CAAkB;AACvC,QAAM,gBAAY,uCAAe;AAEjC,QAAM,aAAS,0CAAqB,CAAC,UAAU;AAC7C,aAAS,EAAE,MAAM,oBAAoB,aAAa,MAAM,CAAC;AAAA,EAC3D,GAAG,GAAG;AAEN,QAAM,cAAc,MAAM;AACxB,gBAAY;AACZ,WAAO,OAAO;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAK,2CAAgB,UAAU,GAAG;AAAA,MAClC,eAAW,YAAAA,aAAG,kCAAoB,iBAAiB,GAAG,SAAS;AAAA,MAC/D,cAAa;AAAA,MACb,aAAa,UAAU;AAAA,QACrB,gBAAgB;AAAA,QAChB,IAAI;AAAA,QACJ,aAAa;AAAA,MACf,CAAC;AAAA,MACD,OAAO;AAAA,MACP,UAAU,CAAC,UAAU;AACnB,cAAM,QAAQ,MAAM,OAAO;AAC3B,uBAAe,KAAK;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,YAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAM,eAAe;AACrB,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,oDAAC,iCAAc,MAAK,QAClB,sDAAC,0CAAoB,eAAY,QAAO,QAAO,MAAK,OAAM,MAAK,GACjE;AAAA,QAEA,4CAAC,iCAAc,MAAK,SACjB,WAAC,CAAC,eACD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAO,UAAU;AAAA,cACf,gBAAgB;AAAA,cAChB,IAAI;AAAA,cACJ,aAAa;AAAA,YACf,CAAC;AAAA,YAED,sDAAC,iCAAW,eAAY,QAAO;AAAA;AAAA,QACjC,GAEJ;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["cx"]}