@replicated/portal-components 0.0.21 → 0.0.22

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 (182) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/change-team.js +39 -0
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +1 -1
  6. package/dist/actions/index.d.ts +1 -1
  7. package/dist/actions/index.js +40 -0
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +1 -1
  10. package/dist/actions/install-actions.d.ts +1 -1
  11. package/dist/actions/install-actions.js +39 -0
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +1 -1
  14. package/dist/actions/service-account.d.ts +1 -1
  15. package/dist/actions/service-account.js +39 -0
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +1 -1
  18. package/dist/actions/support-bundles.d.ts +1 -1
  19. package/dist/actions/support-bundles.js +39 -0
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +1 -1
  22. package/dist/actions/team-settings.d.ts +1 -1
  23. package/dist/actions/team-settings.js +39 -0
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.js +39 -0
  26. package/dist/actions/trial-signup.js.map +1 -1
  27. package/dist/actions/user-settings.d.mts +1 -1
  28. package/dist/actions/user-settings.d.ts +1 -1
  29. package/dist/actions/user-settings.js +39 -0
  30. package/dist/actions/user-settings.js.map +1 -1
  31. package/dist/airgap-instances.d.mts +1 -1
  32. package/dist/airgap-instances.d.ts +1 -1
  33. package/dist/airgap-instances.js +3 -2
  34. package/dist/airgap-instances.js.map +1 -1
  35. package/dist/esm/actions/change-team.js +39 -0
  36. package/dist/esm/actions/change-team.js.map +1 -1
  37. package/dist/esm/actions/index.js +40 -1
  38. package/dist/esm/actions/index.js.map +1 -1
  39. package/dist/esm/actions/install-actions.js +39 -0
  40. package/dist/esm/actions/install-actions.js.map +1 -1
  41. package/dist/esm/actions/service-account.js +39 -0
  42. package/dist/esm/actions/service-account.js.map +1 -1
  43. package/dist/esm/actions/support-bundles.js +39 -0
  44. package/dist/esm/actions/support-bundles.js.map +1 -1
  45. package/dist/esm/actions/team-settings.js +39 -0
  46. package/dist/esm/actions/team-settings.js.map +1 -1
  47. package/dist/esm/actions/trial-signup.js +39 -0
  48. package/dist/esm/actions/trial-signup.js.map +1 -1
  49. package/dist/esm/actions/user-settings.js +39 -0
  50. package/dist/esm/actions/user-settings.js.map +1 -1
  51. package/dist/esm/airgap-instances.js +3 -2
  52. package/dist/esm/airgap-instances.js.map +1 -1
  53. package/dist/esm/helm-install-wizard.js +414 -189
  54. package/dist/esm/helm-install-wizard.js.map +1 -1
  55. package/dist/esm/index.js +89 -64
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/install-actions.js +39 -0
  58. package/dist/esm/install-actions.js.map +1 -1
  59. package/dist/esm/instance-card.js +2 -1
  60. package/dist/esm/instance-card.js.map +1 -1
  61. package/dist/esm/license-details.js +39 -0
  62. package/dist/esm/license-details.js.map +1 -1
  63. package/dist/esm/linux-install-wizard.js +310 -166
  64. package/dist/esm/linux-install-wizard.js.map +1 -1
  65. package/dist/esm/logout-action.js +187 -0
  66. package/dist/esm/logout-action.js.map +1 -0
  67. package/dist/esm/logout-button.js +32 -0
  68. package/dist/esm/logout-button.js.map +1 -0
  69. package/dist/esm/markdown-renderer.js +16 -0
  70. package/dist/esm/markdown-renderer.js.map +1 -0
  71. package/dist/esm/middleware.js +3 -3
  72. package/dist/esm/middleware.js.map +1 -1
  73. package/dist/esm/online-instance-list.js +3 -2
  74. package/dist/esm/online-instance-list.js.map +1 -1
  75. package/dist/esm/saml-callback-client.js +5 -2
  76. package/dist/esm/saml-callback-client.js.map +1 -1
  77. package/dist/esm/saml-handlers.js +104 -0
  78. package/dist/esm/saml-handlers.js.map +1 -1
  79. package/dist/esm/support-bundle-collection-card.js +3 -2
  80. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  81. package/dist/esm/support-bundles-card.js +2 -2
  82. package/dist/esm/support-bundles-card.js.map +1 -1
  83. package/dist/esm/support-card.js +39 -0
  84. package/dist/esm/support-card.js.map +1 -1
  85. package/dist/esm/top-nav-menu-close.js +46 -0
  86. package/dist/esm/top-nav-menu-close.js.map +1 -0
  87. package/dist/esm/top-nav.js +149 -59
  88. package/dist/esm/top-nav.js.map +1 -1
  89. package/dist/esm/trial-signup.js +6 -3
  90. package/dist/esm/trial-signup.js.map +1 -1
  91. package/dist/esm/update-layout.js +149 -59
  92. package/dist/esm/update-layout.js.map +1 -1
  93. package/dist/esm/upload-support-bundle-modal.js +2 -2
  94. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  95. package/dist/esm/user-menu-dropdown.js +52 -0
  96. package/dist/esm/user-menu-dropdown.js.map +1 -0
  97. package/dist/esm/user-settings.js +5 -5
  98. package/dist/esm/user-settings.js.map +1 -1
  99. package/dist/esm/utils/index.js +39 -0
  100. package/dist/esm/utils/index.js.map +1 -1
  101. package/dist/helm-install-wizard.d.mts +18 -7
  102. package/dist/helm-install-wizard.d.ts +18 -7
  103. package/dist/helm-install-wizard.js +418 -189
  104. package/dist/helm-install-wizard.js.map +1 -1
  105. package/dist/{index-sMbq94M7.d.ts → index-DXy7RxOX.d.ts} +18 -1
  106. package/dist/{index-DyzJ0yKD.d.mts → index-JX9-CIMA.d.mts} +18 -1
  107. package/dist/index.d.mts +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +89 -64
  110. package/dist/index.js.map +1 -1
  111. package/dist/install-actions.d.mts +2 -2
  112. package/dist/install-actions.d.ts +2 -2
  113. package/dist/install-actions.js +39 -0
  114. package/dist/install-actions.js.map +1 -1
  115. package/dist/instance-card.d.mts +1 -1
  116. package/dist/instance-card.d.ts +1 -1
  117. package/dist/instance-card.js +2 -1
  118. package/dist/instance-card.js.map +1 -1
  119. package/dist/license-details.js +39 -0
  120. package/dist/license-details.js.map +1 -1
  121. package/dist/linux-install-wizard.d.mts +17 -7
  122. package/dist/linux-install-wizard.d.ts +17 -7
  123. package/dist/linux-install-wizard.js +314 -166
  124. package/dist/linux-install-wizard.js.map +1 -1
  125. package/dist/logout-action.d.mts +7 -0
  126. package/dist/logout-action.d.ts +7 -0
  127. package/dist/logout-action.js +189 -0
  128. package/dist/logout-action.js.map +1 -0
  129. package/dist/logout-button.d.mts +16 -0
  130. package/dist/logout-button.d.ts +16 -0
  131. package/dist/logout-button.js +34 -0
  132. package/dist/logout-button.js.map +1 -0
  133. package/dist/markdown-renderer.d.mts +12 -0
  134. package/dist/markdown-renderer.d.ts +12 -0
  135. package/dist/markdown-renderer.js +22 -0
  136. package/dist/markdown-renderer.js.map +1 -0
  137. package/dist/middleware.js +3 -3
  138. package/dist/middleware.js.map +1 -1
  139. package/dist/online-instance-list.d.mts +1 -1
  140. package/dist/online-instance-list.d.ts +1 -1
  141. package/dist/online-instance-list.js +3 -2
  142. package/dist/online-instance-list.js.map +1 -1
  143. package/dist/pending-installations.d.mts +1 -1
  144. package/dist/pending-installations.d.ts +1 -1
  145. package/dist/saml-callback-client.js +5 -2
  146. package/dist/saml-callback-client.js.map +1 -1
  147. package/dist/saml-handlers.js +104 -0
  148. package/dist/saml-handlers.js.map +1 -1
  149. package/dist/security-card.d.mts +1 -1
  150. package/dist/security-card.d.ts +1 -1
  151. package/dist/styles.css +39 -0
  152. package/dist/support-bundle-collection-card.js +3 -2
  153. package/dist/support-bundle-collection-card.js.map +1 -1
  154. package/dist/support-bundles-card.d.mts +2 -2
  155. package/dist/support-bundles-card.d.ts +2 -2
  156. package/dist/support-bundles-card.js +2 -2
  157. package/dist/support-bundles-card.js.map +1 -1
  158. package/dist/support-card.js +39 -0
  159. package/dist/support-card.js.map +1 -1
  160. package/dist/top-nav-menu-close.d.mts +10 -0
  161. package/dist/top-nav-menu-close.d.ts +10 -0
  162. package/dist/top-nav-menu-close.js +48 -0
  163. package/dist/top-nav-menu-close.js.map +1 -0
  164. package/dist/top-nav.js +149 -59
  165. package/dist/top-nav.js.map +1 -1
  166. package/dist/trial-signup.js +6 -3
  167. package/dist/trial-signup.js.map +1 -1
  168. package/dist/update-layout.js +149 -59
  169. package/dist/update-layout.js.map +1 -1
  170. package/dist/upload-support-bundle-modal.js +2 -2
  171. package/dist/upload-support-bundle-modal.js.map +1 -1
  172. package/dist/user-menu-dropdown.d.mts +25 -0
  173. package/dist/user-menu-dropdown.d.ts +25 -0
  174. package/dist/user-menu-dropdown.js +59 -0
  175. package/dist/user-menu-dropdown.js.map +1 -0
  176. package/dist/user-settings.js +5 -5
  177. package/dist/user-settings.js.map +1 -1
  178. package/dist/utils/index.d.mts +1 -1
  179. package/dist/utils/index.d.ts +1 -1
  180. package/dist/utils/index.js +39 -0
  181. package/dist/utils/index.js.map +1 -1
  182. package/package.json +29 -2
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { useEffect } from 'react';
3
+
4
+ /**
5
+ * Enterprise Portal Components
6
+ * This file is generated by tsup. Do not edit manually.
7
+ */
8
+
9
+ function TopNavMenuClose() {
10
+ useEffect(() => {
11
+ const closeAllDetails = () => {
12
+ const openDetails = document.querySelectorAll("details[open]");
13
+ openDetails.forEach((details) => {
14
+ details.removeAttribute("open");
15
+ });
16
+ };
17
+ const handleLinkClick = () => {
18
+ closeAllDetails();
19
+ };
20
+ const handleClickOutside = (event) => {
21
+ const target = event.target;
22
+ const openDetails = document.querySelectorAll("details[open]");
23
+ openDetails.forEach((details) => {
24
+ if (!details.contains(target)) {
25
+ details.removeAttribute("open");
26
+ }
27
+ });
28
+ };
29
+ const menuLinks = document.querySelectorAll('details a[href^="/"]');
30
+ menuLinks.forEach((link) => {
31
+ link.addEventListener("click", handleLinkClick);
32
+ });
33
+ document.addEventListener("mousedown", handleClickOutside);
34
+ return () => {
35
+ menuLinks.forEach((link) => {
36
+ link.removeEventListener("click", handleLinkClick);
37
+ });
38
+ document.removeEventListener("mousedown", handleClickOutside);
39
+ };
40
+ }, []);
41
+ return null;
42
+ }
43
+
44
+ export { TopNavMenuClose };
45
+ //# sourceMappingURL=top-nav-menu-close.js.map
46
+ //# sourceMappingURL=top-nav-menu-close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/top-nav-menu-close.tsx"],"names":[],"mappings":";;;;;;;AAWO,SAAS,eAAA,GAAkB;AAChC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAkB,MAAM;AAE5B,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,gBAAA,CAAiB,eAAe,CAAA;AAC7D,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC/B,QAAA,OAAA,CAAQ,gBAAgB,MAAM,CAAA;AAAA,MAChC,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,gBAAA,CAAiB,eAAe,CAAA;AAC7D,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC/B,QAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,UAAA,OAAA,CAAQ,gBAAgB,MAAM,CAAA;AAAA,QAChC;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,gBAAA,CAAiB,sBAAsB,CAAA;AAClE,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,IAChD,CAAC,CAAA;AAGD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAGzD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC1B,QAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,MACnD,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,IAAA;AACT","file":"top-nav-menu-close.js","sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\n\n/**\n * Client component that adds click handlers to close the user menu dropdown\n * when navigation links are clicked or when clicking outside. This runs after \n * the server-rendered menu is mounted.\n * \n * Works with any <details> dropdown element in the page.\n */\nexport function TopNavMenuClose() {\n useEffect(() => {\n const closeAllDetails = () => {\n // Find all open details elements and close them\n const openDetails = document.querySelectorAll(\"details[open]\");\n openDetails.forEach((details) => {\n details.removeAttribute(\"open\");\n });\n };\n\n const handleLinkClick = () => {\n closeAllDetails();\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n // Check if click is outside all details elements\n const openDetails = document.querySelectorAll(\"details[open]\");\n openDetails.forEach((details) => {\n if (!details.contains(target)) {\n details.removeAttribute(\"open\");\n }\n });\n };\n\n // Add click handlers to all links in dropdown menus\n const menuLinks = document.querySelectorAll('details a[href^=\"/\"]');\n menuLinks.forEach((link) => {\n link.addEventListener(\"click\", handleLinkClick);\n });\n\n // Add click-outside handler\n document.addEventListener(\"mousedown\", handleClickOutside);\n\n // Cleanup\n return () => {\n menuLinks.forEach((link) => {\n link.removeEventListener(\"click\", handleLinkClick);\n });\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return null;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import Link from 'next/link';
2
2
  import { Buffer } from 'buffer';
3
3
  import { cache } from 'react';
4
+ import { User } from 'lucide-react';
4
5
  import { jsxs, jsx } from 'react/jsx-runtime';
5
6
 
6
7
  /**
@@ -20,6 +21,71 @@ __export(tracer_exports, {
20
21
  });
21
22
  var tracer_default;
22
23
 
24
+ // src/utils/api-client.ts
25
+ async function authenticatedFetch(url, options = {}) {
26
+ const { token, ...fetchOptions } = options;
27
+ const headers = new Headers(fetchOptions.headers);
28
+ if (token) {
29
+ headers.set("authorization", `Bearer ${token}`);
30
+ }
31
+ const response = await fetch(url, {
32
+ ...fetchOptions,
33
+ headers
34
+ });
35
+ if (response.status === 401) {
36
+ await handle401();
37
+ }
38
+ if (response.status === 502 || response.status === 503 || response.status === 504) {
39
+ await handleServerError(response.status);
40
+ }
41
+ return response;
42
+ }
43
+ async function handle401() {
44
+ const { redirect } = await import('next/navigation');
45
+ return redirect("/?expired=1");
46
+ }
47
+ function isErrorPage(url) {
48
+ try {
49
+ const urlObj = new URL(url);
50
+ return urlObj.pathname === "/error";
51
+ } catch {
52
+ return url === "/error" || url.startsWith("/error?");
53
+ }
54
+ }
55
+ async function handleServerError(statusCode) {
56
+ const { redirect } = await import('next/navigation');
57
+ const { cookies } = await import('next/headers');
58
+ let sourceUrl;
59
+ try {
60
+ const { headers } = await import('next/headers');
61
+ const headersList = await headers();
62
+ const referer = headersList.get("referer");
63
+ const host = headersList.get("host");
64
+ const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
65
+ if (referer && !isErrorPage(referer)) {
66
+ sourceUrl = referer;
67
+ } else if (host && pathname) {
68
+ const protocol = headersList.get("x-forwarded-proto") || "https";
69
+ sourceUrl = `${protocol}://${host}${pathname}`;
70
+ }
71
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
72
+ const cookieStore = await cookies();
73
+ const preservedSource = cookieStore.get("portal_error_source");
74
+ if (preservedSource?.value) {
75
+ sourceUrl = decodeURIComponent(preservedSource.value);
76
+ cookieStore.delete("portal_error_source");
77
+ }
78
+ }
79
+ } catch (error) {
80
+ console.debug("[portal-components] Could not determine source URL", error);
81
+ }
82
+ const params = new URLSearchParams({ code: String(statusCode) });
83
+ if (sourceUrl) {
84
+ params.set("source", sourceUrl);
85
+ }
86
+ return redirect(`/error?${params.toString()}`);
87
+ }
88
+
23
89
  // src/utils/constants.ts
24
90
  var DEFAULT_PRIMARY_COLOR = "#4f46e5";
25
91
  var DEFAULT_SECONDARY_COLOR = "#6366f1";
@@ -148,6 +214,84 @@ var fetchCustomBrandingImpl = async () => {
148
214
  };
149
215
  };
150
216
  var fetchCustomBranding = cache(fetchCustomBrandingImpl);
217
+ var fetchDocumentationImpl = async () => {
218
+ const { cookies } = await import('next/headers');
219
+ const sessionStore = await cookies();
220
+ const session = sessionStore.get("portal_session");
221
+ const token = session?.value;
222
+ if (!token) {
223
+ throw new Error("Authentication required");
224
+ }
225
+ const url = `${getApiOrigin()}/enterprise-portal/documentation`;
226
+ if (process.env.NODE_ENV !== "production") {
227
+ console.debug(
228
+ "[portal-components] fetching documentation via %s (Enterprise Portal API)",
229
+ url
230
+ );
231
+ }
232
+ const response = await authenticatedFetch(url, {
233
+ method: "GET",
234
+ token,
235
+ headers: {
236
+ accept: "application/json"
237
+ }
238
+ });
239
+ if (!response.ok) {
240
+ throw new Error(
241
+ `Documentation request failed (${response.status} ${response.statusText})`
242
+ );
243
+ }
244
+ const data = await response.json();
245
+ return {
246
+ helmPreInstall: data.helmPreInstall || "",
247
+ helmPostInstall: data.helmPostInstall || "",
248
+ embeddedClusterPreInstall: data.embeddedClusterPreInstall || "",
249
+ embeddedClusterPostInstall: data.embeddedClusterPostInstall || "",
250
+ helmInstallUrl: data.helmInstallUrl || "",
251
+ embeddedClusterInstallUrl: data.embeddedClusterInstallUrl || "",
252
+ valuesOverrideUrl: data.valuesOverrideUrl || ""
253
+ };
254
+ };
255
+ cache(fetchDocumentationImpl);
256
+ function UserMenuDropdown({
257
+ displayLabel,
258
+ children,
259
+ className = ""
260
+ }) {
261
+ return /* @__PURE__ */ jsxs("details", { className: `group relative ${className}`, children: [
262
+ /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors list-none border border-transparent hover:border-gray-200", children: [
263
+ /* @__PURE__ */ jsx(User, { className: "h-4 w-4" }),
264
+ /* @__PURE__ */ jsx("span", { children: displayLabel }),
265
+ /* @__PURE__ */ jsx(
266
+ "svg",
267
+ {
268
+ xmlns: "http://www.w3.org/2000/svg",
269
+ width: "16",
270
+ height: "16",
271
+ viewBox: "0 0 24 24",
272
+ fill: "none",
273
+ stroke: "currentColor",
274
+ strokeWidth: "2",
275
+ strokeLinecap: "round",
276
+ strokeLinejoin: "round",
277
+ className: "h-4 w-4 text-gray-500 transition-transform group-open:rotate-180",
278
+ children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" })
279
+ }
280
+ )
281
+ ] }),
282
+ /* @__PURE__ */ jsx("div", { className: "absolute right-0 mt-2 w-52 rounded-lg border border-gray-200 bg-white py-1.5 shadow-xl z-50", children })
283
+ ] });
284
+ }
285
+ function UserMenuItem({ href, children }) {
286
+ return /* @__PURE__ */ jsx(
287
+ Link,
288
+ {
289
+ href,
290
+ className: "block w-full px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 transition-colors",
291
+ children
292
+ }
293
+ );
294
+ }
151
295
  var defaultTopNavLinks = [
152
296
  {
153
297
  label: "Dashboard",
@@ -444,65 +588,11 @@ var TopNav = async ({
444
588
  ),
445
589
  /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-gray-900", children: brandTitle || "Enterprise Portal" })
446
590
  ] }),
447
- /* @__PURE__ */ jsxs("details", { className: "group relative", children: [
448
- /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 list-none", children: [
449
- /* @__PURE__ */ jsxs(
450
- "svg",
451
- {
452
- xmlns: "http://www.w3.org/2000/svg",
453
- width: "16",
454
- height: "16",
455
- viewBox: "0 0 24 24",
456
- fill: "none",
457
- stroke: "currentColor",
458
- strokeWidth: "2",
459
- strokeLinecap: "round",
460
- strokeLinejoin: "round",
461
- className: "text-gray-500",
462
- children: [
463
- /* @__PURE__ */ jsx("path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" }),
464
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "7", r: "4" })
465
- ]
466
- }
467
- ),
468
- /* @__PURE__ */ jsx("span", { children: displayLabel }),
469
- /* @__PURE__ */ jsx(
470
- "svg",
471
- {
472
- xmlns: "http://www.w3.org/2000/svg",
473
- width: "16",
474
- height: "16",
475
- viewBox: "0 0 24 24",
476
- fill: "none",
477
- stroke: "currentColor",
478
- strokeWidth: "2",
479
- strokeLinecap: "round",
480
- strokeLinejoin: "round",
481
- className: "text-gray-500",
482
- children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" })
483
- }
484
- )
485
- ] }),
486
- /* @__PURE__ */ jsxs("div", { className: "absolute right-0 mt-2 w-48 rounded-md border border-gray-200 bg-white py-2 text-sm text-gray-700 shadow-lg z-50", children: [
487
- /* @__PURE__ */ jsx(
488
- Link,
489
- {
490
- href: "/user-settings",
491
- className: "block w-full px-4 py-2 text-left hover:bg-gray-100",
492
- children: "User settings"
493
- }
494
- ),
495
- /* @__PURE__ */ jsx(
496
- Link,
497
- {
498
- href: "/team-settings",
499
- className: "block w-full px-4 py-2 text-left hover:bg-gray-100",
500
- children: "Team settings"
501
- }
502
- ),
503
- userMenuChildren,
504
- logoutButton
505
- ] })
591
+ /* @__PURE__ */ jsxs(UserMenuDropdown, { displayLabel, children: [
592
+ /* @__PURE__ */ jsx(UserMenuItem, { href: "/user-settings", children: "User settings" }),
593
+ /* @__PURE__ */ jsx(UserMenuItem, { href: "/team-settings", children: "Team settings" }),
594
+ userMenuChildren,
595
+ logoutButton
506
596
  ] })
507
597
  ] }),
508
598
  /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-wrap gap-3 pb-2 text-sm font-medium text-gray-500", children: resolvedLinks.map(({ label, icon, href }) => {