@replicated/portal-components 0.0.11 → 0.0.13

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 (81) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/datadog/tracer.d.ts +3 -0
  4. package/datadog/tracer.js +82 -0
  5. package/datadog/tracer.ts +101 -0
  6. package/dist/actions/index.d.mts +26 -4
  7. package/dist/actions/index.d.ts +26 -4
  8. package/dist/actions/index.js +171 -124
  9. package/dist/actions/index.js.map +1 -1
  10. package/dist/airgap-instances.js.map +1 -1
  11. package/dist/esm/actions/index.js +170 -124
  12. package/dist/esm/actions/index.js.map +1 -1
  13. package/dist/esm/airgap-instances.js.map +1 -1
  14. package/dist/esm/helm-install-wizard.js +15 -9
  15. package/dist/esm/helm-install-wizard.js.map +1 -1
  16. package/dist/esm/index.js +204 -158
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/install-actions.js +42 -47
  19. package/dist/esm/install-actions.js.map +1 -1
  20. package/dist/esm/install-card.js +8 -21
  21. package/dist/esm/install-card.js.map +1 -1
  22. package/dist/esm/instance-card.js.map +1 -1
  23. package/dist/esm/license-card.js +8 -12
  24. package/dist/esm/license-card.js.map +1 -1
  25. package/dist/esm/license-details.js +21 -11
  26. package/dist/esm/license-details.js.map +1 -1
  27. package/dist/esm/linux-install-wizard.js +26 -47
  28. package/dist/esm/linux-install-wizard.js.map +1 -1
  29. package/dist/esm/online-instance-list.js.map +1 -1
  30. package/dist/esm/support-card.js +22 -55
  31. package/dist/esm/support-card.js.map +1 -1
  32. package/dist/esm/team-settings-card.js +8 -13
  33. package/dist/esm/team-settings-card.js.map +1 -1
  34. package/dist/esm/top-nav.js +69 -47
  35. package/dist/esm/top-nav.js.map +1 -1
  36. package/dist/esm/update-layout.js +69 -47
  37. package/dist/esm/update-layout.js.map +1 -1
  38. package/dist/esm/updates-card.js +8 -14
  39. package/dist/esm/updates-card.js.map +1 -1
  40. package/dist/esm/utils/index.js +14 -10
  41. package/dist/esm/utils/index.js.map +1 -1
  42. package/dist/esm/utils/observability/index.js +193 -0
  43. package/dist/esm/utils/observability/index.js.map +1 -0
  44. package/dist/helm-install-wizard.js +15 -9
  45. package/dist/helm-install-wizard.js.map +1 -1
  46. package/dist/index.d.mts +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.js +203 -156
  49. package/dist/index.js.map +1 -1
  50. package/dist/install-actions.js +43 -48
  51. package/dist/install-actions.js.map +1 -1
  52. package/dist/install-card.js +8 -21
  53. package/dist/install-card.js.map +1 -1
  54. package/dist/instance-card.js.map +1 -1
  55. package/dist/license-card.js +8 -12
  56. package/dist/license-card.js.map +1 -1
  57. package/dist/license-details.js +21 -11
  58. package/dist/license-details.js.map +1 -1
  59. package/dist/linux-install-wizard.js +26 -47
  60. package/dist/linux-install-wizard.js.map +1 -1
  61. package/dist/online-instance-list.js.map +1 -1
  62. package/dist/styles.css +2 -2
  63. package/dist/support-card.js +22 -55
  64. package/dist/support-card.js.map +1 -1
  65. package/dist/team-settings-card.js +8 -13
  66. package/dist/team-settings-card.js.map +1 -1
  67. package/dist/top-nav.js +69 -47
  68. package/dist/top-nav.js.map +1 -1
  69. package/dist/update-layout.js +69 -47
  70. package/dist/update-layout.js.map +1 -1
  71. package/dist/updates-card.js +8 -14
  72. package/dist/updates-card.js.map +1 -1
  73. package/dist/utils/index.js +14 -10
  74. package/dist/utils/index.js.map +1 -1
  75. package/dist/utils/observability/index.d.mts +13 -0
  76. package/dist/utils/observability/index.d.ts +13 -0
  77. package/dist/utils/observability/index.js +198 -0
  78. package/dist/utils/observability/index.js.map +1 -0
  79. package/instrumentation.d.ts +8 -0
  80. package/instrumentation.js +22 -0
  81. package/package.json +16 -3
package/dist/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { forwardRef, cache, useState, useMemo } from 'react';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { Buffer as Buffer$1 } from 'buffer';
3
+ import { Buffer } from 'buffer';
4
4
  import Link from 'next/link';
5
5
 
6
6
  /**
@@ -10,7 +10,7 @@ import Link from 'next/link';
10
10
 
11
11
  // package.json
12
12
  var package_default = {
13
- version: "0.0.11"};
13
+ version: "0.0.13"};
14
14
 
15
15
  // src/tokens/index.ts
16
16
  var baseTokens = {
@@ -187,7 +187,7 @@ var initiateLogin = defineServerAction({
187
187
  visibility: "customer",
188
188
  tags: ["auth", "login", "session"],
189
189
  async run(input) {
190
- const endpoint = `${getApiOrigin()}/v3/login/magic-link`;
190
+ const endpoint = `${getApiOrigin()}/enterprise-portal/auth/magic-link`;
191
191
  const appSlug = process.env.PORTAL_APP_SLUG;
192
192
  if (!appSlug) {
193
193
  throw new Error("PORTAL_APP_SLUG is not configured");
@@ -237,7 +237,7 @@ var verifyMagicLink = defineServerAction({
237
237
  visibility: "customer",
238
238
  tags: ["auth", "login", "verify"],
239
239
  async run({ nonce }) {
240
- const endpoint = `${getApiOrigin()}/v3/login/magic-link/verify`;
240
+ const endpoint = `${getApiOrigin()}/enterprise-portal/auth/magic-link/verify`;
241
241
  if (process.env.NODE_ENV !== "production") {
242
242
  console.debug(
243
243
  "[portal-components] verifying magic link via %s",
@@ -293,12 +293,12 @@ var fetchCustomBrandingImpl = async () => {
293
293
  if (!appSlug) {
294
294
  throw new Error("PORTAL_APP_SLUG is not configured");
295
295
  }
296
- const url = `${getApiOrigin()}/v3/custom-branding?app_slug=${encodeURIComponent(
296
+ const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
297
297
  appSlug
298
298
  )}`;
299
299
  if (process.env.NODE_ENV !== "production") {
300
300
  console.debug(
301
- "[portal-components] fetching custom branding via %s",
301
+ "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
302
302
  url
303
303
  );
304
304
  }
@@ -313,13 +313,18 @@ var fetchCustomBrandingImpl = async () => {
313
313
  );
314
314
  }
315
315
  const payload = await response.json();
316
- const brandingData = payload?.branding_data;
317
- if (typeof brandingData !== "string") {
318
- throw new Error("Custom branding response missing branding_data string");
319
- }
316
+ const brandingObject = {
317
+ logo: payload.logoUrl,
318
+ title: payload.appName,
319
+ customColor1: payload.primaryColor,
320
+ customColor2: payload.secondaryColor,
321
+ favicon: payload.faviconUrl
322
+ };
323
+ const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
320
324
  return {
321
325
  brandingData,
322
- documentation: payload?.documentation ?? null
326
+ documentation: null
327
+ // Documentation not included in new API's public endpoint
323
328
  };
324
329
  };
325
330
  var fetchCustomBranding = cache(fetchCustomBrandingImpl);
@@ -347,22 +352,6 @@ var getCustomerIdFromToken = (token) => {
347
352
  }
348
353
  return customerId.trim();
349
354
  };
350
- var resolveSupportBundlesEndpoint = () => {
351
- const fallback = `${getApiOrigin()}/v3/supportbundles`;
352
- const explicit = process.env.SUPPORT_BUNDLES_ENDPOINT;
353
- if (!explicit) {
354
- return new URL(fallback);
355
- }
356
- try {
357
- return new URL(explicit);
358
- } catch (error) {
359
- console.warn(
360
- `[portal-components] invalid SUPPORT_BUNDLES_ENDPOINT, using fallback`,
361
- error
362
- );
363
- return new URL(fallback);
364
- }
365
- };
366
355
  var listSupportBundles = defineServerAction({
367
356
  id: "support/list-bundles",
368
357
  description: "Fetches support bundles associated with the customer found in the portal session JWT.",
@@ -372,17 +361,11 @@ var listSupportBundles = defineServerAction({
372
361
  if (!token || typeof token !== "string") {
373
362
  throw new Error("Support bundle listing requires a session token");
374
363
  }
375
- const payload = decodeJwtPayload(token);
376
- const customerId = payload?.customer_id;
377
- if (typeof customerId !== "string" || !customerId.trim()) {
378
- throw new Error("Unable to determine customer_id from session token");
379
- }
380
- const url = resolveSupportBundlesEndpoint();
381
- url.searchParams.set("customer_id", customerId.trim());
364
+ const url = `${getApiOrigin()}/enterprise-portal/support-bundles`;
382
365
  if (process.env.NODE_ENV !== "production") {
383
- console.debug("[portal-components] fetching support bundles via %s", url);
366
+ console.debug("[portal-components] fetching support bundles via %s (Enterprise Portal API)", url);
384
367
  }
385
- const response = await authenticatedFetch(url.toString(), {
368
+ const response = await authenticatedFetch(url, {
386
369
  token,
387
370
  headers: {
388
371
  accept: "application/json"
@@ -397,7 +380,8 @@ var listSupportBundles = defineServerAction({
397
380
  `Support bundles request failed (${response.status} ${response.statusText})`
398
381
  );
399
382
  }
400
- const raw = await response.json();
383
+ const payload = await response.json();
384
+ const raw = payload.data;
401
385
  const rawRecord = raw && typeof raw === "object" ? raw : void 0;
402
386
  const parseInsights = (raw2) => {
403
387
  if (!Array.isArray(raw2)) return void 0;
@@ -488,12 +472,8 @@ var downloadSupportBundle = defineServerAction({
488
472
  if (!bundleId || typeof bundleId !== "string") {
489
473
  throw new Error("Support bundle download requires a bundle ID");
490
474
  }
491
- const payload = decodeJwtPayload(token);
492
- const customerId = payload?.customer_id;
493
- if (typeof customerId !== "string" || !customerId.trim()) {
494
- throw new Error("Unable to determine customer_id from session token");
495
- }
496
- const endpoint = `${getApiOrigin()}/v3/supportbundle/${encodeURIComponent(bundleId)}/download?customer_id=${encodeURIComponent(customerId.trim())}`;
475
+ const customerId = getCustomerIdFromToken(token);
476
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/${encodeURIComponent(bundleId)}/download?customer_id=${encodeURIComponent(customerId)}`;
497
477
  if (process.env.NODE_ENV !== "production") {
498
478
  console.debug("[portal-components] getting support bundle download URL via %s", endpoint);
499
479
  }
@@ -531,12 +511,8 @@ var deleteSupportBundle = defineServerAction({
531
511
  if (!bundleId || typeof bundleId !== "string") {
532
512
  throw new Error("Support bundle deletion requires a bundle ID");
533
513
  }
534
- const payload = decodeJwtPayload(token);
535
- const customerId = payload?.customer_id;
536
- if (typeof customerId !== "string" || !customerId.trim()) {
537
- throw new Error("Unable to determine customer_id from session token");
538
- }
539
- const endpoint = `${getApiOrigin()}/v3/supportbundle/${encodeURIComponent(bundleId)}?customer_id=${encodeURIComponent(customerId.trim())}`;
514
+ const customerId = getCustomerIdFromToken(token);
515
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/${encodeURIComponent(bundleId)}?customer_id=${encodeURIComponent(customerId)}`;
540
516
  if (process.env.NODE_ENV !== "production") {
541
517
  console.debug("[portal-components] deleting support bundle via %s", endpoint);
542
518
  }
@@ -575,7 +551,7 @@ var uploadSupportBundle = defineServerAction({
575
551
  if (!fileContent || !(fileContent instanceof ArrayBuffer)) {
576
552
  throw new Error("Support bundle upload requires file content");
577
553
  }
578
- const endpoint = `${getApiOrigin()}/v3/supportbundle/upload/${encodeURIComponent(appId)}`;
554
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/upload/${encodeURIComponent(appId)}`;
579
555
  if (process.env.NODE_ENV !== "production") {
580
556
  console.debug("[portal-components] uploading support bundle via %s", endpoint);
581
557
  }
@@ -603,7 +579,7 @@ var uploadSupportBundle = defineServerAction({
603
579
  }
604
580
  });
605
581
  var getSupportBundleUploadUrl = (appId) => {
606
- return `${getApiOrigin()}/v3/supportbundle/upload/${encodeURIComponent(appId)}`;
582
+ return `${getApiOrigin()}/enterprise-portal/support-bundles/upload/${encodeURIComponent(appId)}`;
607
583
  };
608
584
  var listReleases = defineServerAction({
609
585
  id: "releases/list",
@@ -614,10 +590,10 @@ var listReleases = defineServerAction({
614
590
  if (!token || typeof token !== "string") {
615
591
  throw new Error("List releases requires a session token");
616
592
  }
617
- const endpoint = `${getApiOrigin()}/v3/release-history`;
618
- console.log("[portal-components] listReleases request", {
619
- endpoint
620
- });
593
+ const endpoint = `${getApiOrigin()}/enterprise-portal/releases`;
594
+ if (process.env.NODE_ENV !== "production") {
595
+ console.debug("[portal-components] fetching releases via %s (Enterprise Portal API)", endpoint);
596
+ }
621
597
  const response = await authenticatedFetch(endpoint, {
622
598
  method: "GET",
623
599
  token,
@@ -630,7 +606,6 @@ var listReleases = defineServerAction({
630
606
  console.warn("[portal-components] listReleases read error", error);
631
607
  return null;
632
608
  });
633
- console.log("[portal-components] listReleases response", response.status, bodyText);
634
609
  if (!response.ok) {
635
610
  throw new Error(
636
611
  `List releases request failed (${response.status} ${response.statusText})`
@@ -927,7 +902,10 @@ var fetchLicenseDetails = defineServerAction({
927
902
  if (typeof token !== "string" || token.trim().length === 0) {
928
903
  throw new Error("fetchLicenseDetails requires a non-empty token");
929
904
  }
930
- const endpoint = `${getApiOrigin()}/v3/license`;
905
+ const endpoint = `${getApiOrigin()}/enterprise-portal/license`;
906
+ if (process.env.NODE_ENV !== "production") {
907
+ console.debug("[portal-components] fetching license via %s (Enterprise Portal API)", endpoint);
908
+ }
931
909
  const response = await authenticatedFetch(endpoint, {
932
910
  method: "GET",
933
911
  token,
@@ -942,10 +920,11 @@ var fetchLicenseDetails = defineServerAction({
942
920
  );
943
921
  }
944
922
  const payload = await response.json();
945
- const license = normalizeLicensePayload(payload);
923
+ const licenseData = payload.data;
924
+ const license = normalizeLicensePayload(licenseData);
946
925
  return {
947
926
  license,
948
- raw: payload ?? null
927
+ raw: licenseData ?? null
949
928
  };
950
929
  }
951
930
  });
@@ -958,16 +937,14 @@ var getSecurityInfo = defineServerAction({
958
937
  if (!token || typeof token !== "string") {
959
938
  throw new Error("Security info request requires a session token");
960
939
  }
961
- const customerId = getCustomerIdFromToken(token);
962
940
  const params = new URLSearchParams({
963
- customer_id: customerId,
964
941
  install_type: installType,
965
942
  channel_sequence: channelSequence.toString(),
966
943
  is_airgap: isAirgap.toString()
967
944
  });
968
- const url = `${getApiOrigin()}/v3/security-info?${params.toString()}`;
945
+ const url = `${getApiOrigin()}/enterprise-portal/security?${params.toString()}`;
969
946
  if (process.env.NODE_ENV !== "production") {
970
- console.debug("[portal-components] fetching security info via %s", url);
947
+ console.debug("[portal-components] fetching security info via %s (Enterprise Portal API)", url);
971
948
  }
972
949
  const response = await authenticatedFetch(url, {
973
950
  token,
@@ -979,8 +956,8 @@ var getSecurityInfo = defineServerAction({
979
956
  `Security info request failed (${response.status} ${response.statusText})`
980
957
  );
981
958
  }
982
- const data = await response.json();
983
- return data;
959
+ const payload = await response.json();
960
+ return payload.data;
984
961
  }
985
962
  });
986
963
  var getSecurityInfoDiff = defineServerAction({
@@ -992,15 +969,13 @@ var getSecurityInfoDiff = defineServerAction({
992
969
  if (!token || typeof token !== "string") {
993
970
  throw new Error("Security info diff request requires a session token");
994
971
  }
995
- const customerId = getCustomerIdFromToken(token);
996
972
  const params = new URLSearchParams({
997
- customer_id: customerId,
998
973
  install_type: installType,
999
974
  from_channel_sequence: fromChannelSequence.toString(),
1000
975
  to_channel_sequence: toChannelSequence.toString(),
1001
976
  is_airgap: isAirgap.toString()
1002
977
  });
1003
- const url = `${getApiOrigin()}/v3/security-info-diff?${params.toString()}`;
978
+ const url = `${getApiOrigin()}/enterprise-portal/security-diff?${params.toString()}`;
1004
979
  if (process.env.NODE_ENV !== "production") {
1005
980
  console.debug("[portal-components] fetching security info diff via %s", url);
1006
981
  }
@@ -1014,8 +989,8 @@ var getSecurityInfoDiff = defineServerAction({
1014
989
  `Security info diff request failed (${response.status} ${response.statusText})`
1015
990
  );
1016
991
  }
1017
- const data = await response.json();
1018
- return data;
992
+ const envelope = await response.json();
993
+ return envelope.data;
1019
994
  }
1020
995
  });
1021
996
  var getSecurityInfoSBOM = defineServerAction({
@@ -1027,15 +1002,13 @@ var getSecurityInfoSBOM = defineServerAction({
1027
1002
  if (!token || typeof token !== "string") {
1028
1003
  throw new Error("Security SBOM request requires a session token");
1029
1004
  }
1030
- const customerId = getCustomerIdFromToken(token);
1031
1005
  const params = new URLSearchParams({
1032
- customer_id: customerId,
1033
1006
  install_type: installType,
1034
1007
  channel_sequence: channelSequence.toString(),
1035
1008
  is_airgap: isAirgap.toString(),
1036
1009
  unified_sbom: unifiedSbom.toString()
1037
1010
  });
1038
- const url = `${getApiOrigin()}/v3/security-info-sbom?${params.toString()}`;
1011
+ const url = `${getApiOrigin()}/enterprise-portal/security-sbom?${params.toString()}`;
1039
1012
  if (process.env.NODE_ENV !== "production") {
1040
1013
  console.debug("[portal-components] fetching security SBOM via %s", url);
1041
1014
  }
@@ -1052,8 +1025,77 @@ var getSecurityInfoSBOM = defineServerAction({
1052
1025
  `Security SBOM request failed (${response.status} ${response.statusText})`
1053
1026
  );
1054
1027
  }
1055
- const data = await response.json();
1056
- return data;
1028
+ const envelope = await response.json();
1029
+ return envelope.data;
1030
+ }
1031
+ });
1032
+ var fetchDashboardComposite = defineServerAction({
1033
+ id: "dashboard/fetch-composite",
1034
+ description: "Fetches all dashboard data from the composite Enterprise Portal API endpoint",
1035
+ visibility: "customer",
1036
+ tags: ["dashboard", "enterprise-portal-api"],
1037
+ async run({ token }, context) {
1038
+ if (!token || typeof token !== "string") {
1039
+ throw new Error("Dashboard request requires a session token");
1040
+ }
1041
+ const origin = getApiOrigin();
1042
+ const url = `${origin}/enterprise-portal/dashboard`;
1043
+ if (process.env.NODE_ENV !== "production") {
1044
+ console.debug("[portal-components] fetching dashboard via %s (Enterprise Portal API)", url);
1045
+ }
1046
+ const response = await authenticatedFetch(url, {
1047
+ method: "GET",
1048
+ token,
1049
+ headers: { accept: "application/json" },
1050
+ signal: context?.signal
1051
+ });
1052
+ if (!response.ok) {
1053
+ throw new Error(
1054
+ `Dashboard request failed (${response.status} ${response.statusText})`
1055
+ );
1056
+ }
1057
+ const payload = await response.json();
1058
+ const data = payload.data;
1059
+ const allInstances = data?.instances || [];
1060
+ const channelReleases = data?.channelReleases || [];
1061
+ const licenseData = data?.license || {};
1062
+ const teamStats = data?.teamStats || {};
1063
+ const onlineInstances = allInstances.filter((i) => !i.isAirgap);
1064
+ const airgapInstances = allInstances.filter((i) => i.isAirgap);
1065
+ const twentyFourHoursAgo = Date.now() - 24 * 60 * 60 * 1e3;
1066
+ const activeOnlineInstances = onlineInstances.filter((instance) => {
1067
+ const lastCheckin = instance.lastCheckin ? new Date(instance.lastCheckin).getTime() : 0;
1068
+ return lastCheckin > twentyFourHoursAgo;
1069
+ });
1070
+ const onlineActiveCount = activeOnlineInstances.length;
1071
+ const airgapCount = airgapInstances.length;
1072
+ const calculateUpdates = (instances) => {
1073
+ if (!channelReleases.length) return 0;
1074
+ let numUpdates = 0;
1075
+ for (const instance of instances) {
1076
+ const instanceSequence = instance.channelSequence ?? 0;
1077
+ const matchingReleases = channelReleases.filter(
1078
+ (release) => release.channelId === instance.channelId
1079
+ );
1080
+ for (const release of matchingReleases) {
1081
+ if ((release.channelSequence ?? 0) > instanceSequence) {
1082
+ numUpdates++;
1083
+ }
1084
+ }
1085
+ }
1086
+ return numUpdates;
1087
+ };
1088
+ const onlineUpdates = calculateUpdates(activeOnlineInstances);
1089
+ const airgapUpdates = calculateUpdates(airgapInstances);
1090
+ return {
1091
+ onlineActiveCount,
1092
+ airgapCount,
1093
+ onlineUpdates,
1094
+ airgapUpdates,
1095
+ // Additional data available from the composite endpoint
1096
+ license: licenseData,
1097
+ teamStats
1098
+ };
1057
1099
  }
1058
1100
  });
1059
1101
  var fetchCurrentUser = defineServerAction({
@@ -1065,7 +1107,7 @@ var fetchCurrentUser = defineServerAction({
1065
1107
  if (!token || typeof token !== "string") {
1066
1108
  throw new Error("Fetch current user requires a session token");
1067
1109
  }
1068
- const endpoint = `${getApiOrigin()}/v3/user`;
1110
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
1069
1111
  if (process.env.NODE_ENV !== "production") {
1070
1112
  console.debug("[portal-components] fetching current user via %s", endpoint);
1071
1113
  }
@@ -1102,7 +1144,7 @@ var updateUser = defineServerAction({
1102
1144
  if (!firstName && !lastName) {
1103
1145
  throw new Error("At least one of firstName or lastName must be provided");
1104
1146
  }
1105
- const endpoint = `${getApiOrigin()}/v3/user`;
1147
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
1106
1148
  if (process.env.NODE_ENV !== "production") {
1107
1149
  console.debug("[portal-components] updating user via %s", endpoint);
1108
1150
  }
@@ -1110,7 +1152,7 @@ var updateUser = defineServerAction({
1110
1152
  if (firstName !== void 0) body.firstName = firstName;
1111
1153
  if (lastName !== void 0) body.lastName = lastName;
1112
1154
  const response = await authenticatedFetch(endpoint, {
1113
- method: "POST",
1155
+ method: "PUT",
1114
1156
  token,
1115
1157
  headers: {
1116
1158
  "content-type": "application/json",
@@ -1138,9 +1180,9 @@ var fetchNotifications = defineServerAction({
1138
1180
  throw new Error("Fetch notifications requires a session token");
1139
1181
  }
1140
1182
  if (!customerId || typeof customerId !== "string") {
1141
- throw new Error("Fetch notifications requires a customerId");
1183
+ throw new Error("Fetch notifications requires a valid customerId");
1142
1184
  }
1143
- const endpoint = `${getApiOrigin()}/v3/notifications?customer_id=${encodeURIComponent(customerId)}`;
1185
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
1144
1186
  if (process.env.NODE_ENV !== "production") {
1145
1187
  console.debug("[portal-components] fetching notifications via %s", endpoint);
1146
1188
  }
@@ -1171,12 +1213,12 @@ var updateNotifications = defineServerAction({
1171
1213
  throw new Error("Update notifications requires a session token");
1172
1214
  }
1173
1215
  if (!customerId || typeof customerId !== "string") {
1174
- throw new Error("Update notifications requires a customerId");
1216
+ throw new Error("Update notifications requires a valid customerId");
1175
1217
  }
1176
1218
  if (!Array.isArray(notifications)) {
1177
1219
  throw new Error("Update notifications requires a notifications array");
1178
1220
  }
1179
- const endpoint = `${getApiOrigin()}/v3/notifications?customer_id=${encodeURIComponent(customerId)}`;
1221
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
1180
1222
  if (process.env.NODE_ENV !== "production") {
1181
1223
  console.debug("[portal-components] updating notifications via %s", endpoint);
1182
1224
  }
@@ -1447,7 +1489,7 @@ var LicenseDetails = async ({
1447
1489
  console.debug("[portal-components] license response", response.raw);
1448
1490
  const { license } = response;
1449
1491
  const rows = buildPrimaryRows(license);
1450
- return /* @__PURE__ */ jsxs("div", { className: "rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1492
+ return /* @__PURE__ */ jsxs("div", { className: "rounded border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1451
1493
  /* @__PURE__ */ jsxs("header", { className: "flex flex-col border-b border-gray-100 pb-6", children: [
1452
1494
  /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold text-gray-900", children: title }),
1453
1495
  description ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600", children: description }) : null
@@ -1461,7 +1503,6 @@ var LicenseDetails = async ({
1461
1503
  ] })
1462
1504
  ] });
1463
1505
  };
1464
- var defaultHiddenLabels = ["Download"];
1465
1506
  var defaultTopNavLinks = [
1466
1507
  {
1467
1508
  label: "Dashboard",
@@ -1474,16 +1515,21 @@ var defaultTopNavLinks = [
1474
1515
  className: "h-4 w-4",
1475
1516
  fill: "none",
1476
1517
  stroke: "currentColor",
1477
- strokeWidth: "1.5",
1518
+ strokeWidth: "2",
1519
+ strokeLinecap: "round",
1520
+ strokeLinejoin: "round",
1478
1521
  children: [
1479
- /* @__PURE__ */ jsx("path", { d: "M4 13h6V3H4z" }),
1480
- /* @__PURE__ */ jsx("path", { d: "M14 21h6V3h-6z" })
1522
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "9", x: "3", y: "3", rx: "1" }),
1523
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "5", x: "14", y: "3", rx: "1" }),
1524
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "9", x: "14", y: "12", rx: "1" }),
1525
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "5", x: "3", y: "16", rx: "1" })
1481
1526
  ]
1482
1527
  }
1483
1528
  )
1484
1529
  },
1485
1530
  {
1486
- label: "Download",
1531
+ label: "Install",
1532
+ href: "/install",
1487
1533
  icon: /* @__PURE__ */ jsxs(
1488
1534
  "svg",
1489
1535
  {
@@ -1492,18 +1538,20 @@ var defaultTopNavLinks = [
1492
1538
  className: "h-4 w-4",
1493
1539
  fill: "none",
1494
1540
  stroke: "currentColor",
1495
- strokeWidth: "1.5",
1541
+ strokeWidth: "2",
1542
+ strokeLinecap: "round",
1543
+ strokeLinejoin: "round",
1496
1544
  children: [
1497
- /* @__PURE__ */ jsx("path", { d: "M12 3v12" }),
1498
- /* @__PURE__ */ jsx("path", { d: "m7 11 5 5 5-5" }),
1499
- /* @__PURE__ */ jsx("path", { d: "M5 21h14" })
1545
+ /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
1546
+ /* @__PURE__ */ jsx("polyline", { points: "7 10 12 15 17 10" }),
1547
+ /* @__PURE__ */ jsx("line", { x1: "12", x2: "12", y1: "15", y2: "3" })
1500
1548
  ]
1501
1549
  }
1502
1550
  )
1503
1551
  },
1504
1552
  {
1505
- label: "Install",
1506
- href: "/install",
1553
+ label: "Update",
1554
+ href: "/update",
1507
1555
  icon: /* @__PURE__ */ jsxs(
1508
1556
  "svg",
1509
1557
  {
@@ -1512,18 +1560,20 @@ var defaultTopNavLinks = [
1512
1560
  className: "h-4 w-4",
1513
1561
  fill: "none",
1514
1562
  stroke: "currentColor",
1515
- strokeWidth: "1.5",
1563
+ strokeWidth: "2",
1564
+ strokeLinecap: "round",
1565
+ strokeLinejoin: "round",
1516
1566
  children: [
1517
- /* @__PURE__ */ jsx("path", { d: "M12 5v14" }),
1518
- /* @__PURE__ */ jsx("path", { d: "M5 12h14" })
1567
+ /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }),
1568
+ /* @__PURE__ */ jsx("path", { d: "M21 3v5h-5" })
1519
1569
  ]
1520
1570
  }
1521
1571
  )
1522
1572
  },
1523
1573
  {
1524
- label: "Update",
1525
- href: "/update",
1526
- icon: /* @__PURE__ */ jsxs(
1574
+ label: "Security",
1575
+ href: "/security",
1576
+ icon: /* @__PURE__ */ jsx(
1527
1577
  "svg",
1528
1578
  {
1529
1579
  xmlns: "http://www.w3.org/2000/svg",
@@ -1531,12 +1581,10 @@ var defaultTopNavLinks = [
1531
1581
  className: "h-4 w-4",
1532
1582
  fill: "none",
1533
1583
  stroke: "currentColor",
1534
- strokeWidth: "1.5",
1535
- children: [
1536
- /* @__PURE__ */ jsx("path", { d: "M4 4v6h6" }),
1537
- /* @__PURE__ */ jsx("path", { d: "M20 20v-6h-6" }),
1538
- /* @__PURE__ */ jsx("path", { d: "M4 10c1.5-4 6-6 10-4m6 4c-1.5 4-6 6-10 4" })
1539
- ]
1584
+ strokeWidth: "2",
1585
+ strokeLinecap: "round",
1586
+ strokeLinejoin: "round",
1587
+ children: /* @__PURE__ */ jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" })
1540
1588
  }
1541
1589
  )
1542
1590
  },
@@ -1551,10 +1599,15 @@ var defaultTopNavLinks = [
1551
1599
  className: "h-4 w-4",
1552
1600
  fill: "none",
1553
1601
  stroke: "currentColor",
1554
- strokeWidth: "1.5",
1602
+ strokeWidth: "2",
1603
+ strokeLinecap: "round",
1604
+ strokeLinejoin: "round",
1555
1605
  children: [
1556
- /* @__PURE__ */ jsx("path", { d: "M12 8v4l3 2" }),
1557
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" })
1606
+ /* @__PURE__ */ jsx("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
1607
+ /* @__PURE__ */ jsx("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
1608
+ /* @__PURE__ */ jsx("path", { d: "M10 9H8" }),
1609
+ /* @__PURE__ */ jsx("path", { d: "M16 13H8" }),
1610
+ /* @__PURE__ */ jsx("path", { d: "M16 17H8" })
1558
1611
  ]
1559
1612
  }
1560
1613
  )
@@ -1570,12 +1623,13 @@ var defaultTopNavLinks = [
1570
1623
  className: "h-4 w-4",
1571
1624
  fill: "none",
1572
1625
  stroke: "currentColor",
1573
- strokeWidth: "1.5",
1626
+ strokeWidth: "2",
1627
+ strokeLinecap: "round",
1628
+ strokeLinejoin: "round",
1574
1629
  children: [
1575
- /* @__PURE__ */ jsx("rect", { width: "14", height: "18", x: "5", y: "3", rx: "2" }),
1576
- /* @__PURE__ */ jsx("path", { d: "M9 7h6" }),
1577
- /* @__PURE__ */ jsx("path", { d: "M9 11h6" }),
1578
- /* @__PURE__ */ jsx("path", { d: "M9 15h6" })
1630
+ /* @__PURE__ */ jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
1631
+ /* @__PURE__ */ jsx("path", { d: "m21 2-9.6 9.6" }),
1632
+ /* @__PURE__ */ jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })
1579
1633
  ]
1580
1634
  }
1581
1635
  )
@@ -1591,10 +1645,16 @@ var defaultTopNavLinks = [
1591
1645
  className: "h-4 w-4",
1592
1646
  fill: "none",
1593
1647
  stroke: "currentColor",
1594
- strokeWidth: "1.5",
1648
+ strokeWidth: "2",
1649
+ strokeLinecap: "round",
1650
+ strokeLinejoin: "round",
1595
1651
  children: [
1596
- /* @__PURE__ */ jsx("path", { d: "M18 16a6 6 0 1 0-12 0v2h12Z" }),
1597
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "7", r: "4" })
1652
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
1653
+ /* @__PURE__ */ jsx("path", { d: "m4.93 4.93 4.24 4.24" }),
1654
+ /* @__PURE__ */ jsx("path", { d: "m14.83 9.17 4.24-4.24" }),
1655
+ /* @__PURE__ */ jsx("path", { d: "m14.83 14.83 4.24 4.24" }),
1656
+ /* @__PURE__ */ jsx("path", { d: "m9.17 14.83-4.24 4.24" }),
1657
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "4" })
1598
1658
  ]
1599
1659
  }
1600
1660
  )
@@ -1647,7 +1707,7 @@ var TopNav = async ({
1647
1707
  try {
1648
1708
  const branding = await fetchCustomBranding();
1649
1709
  if (branding.brandingData) {
1650
- const decoded = Buffer$1.from(branding.brandingData, "base64").toString(
1710
+ const decoded = Buffer.from(branding.brandingData, "base64").toString(
1651
1711
  "utf-8"
1652
1712
  );
1653
1713
  try {
@@ -1680,8 +1740,7 @@ var TopNav = async ({
1680
1740
  console.debug("[portal-components] branding fetch failed", error);
1681
1741
  }
1682
1742
  const baseLinks = links ?? defaultTopNavLinks;
1683
- const computedHiddenLabels = hiddenLabels ? hiddenLabels : links ? void 0 : defaultHiddenLabels;
1684
- const hiddenSet = computedHiddenLabels ? new Set(computedHiddenLabels) : null;
1743
+ const hiddenSet = hiddenLabels ? new Set(hiddenLabels) : null;
1685
1744
  let resolvedLinks = baseLinks.filter(
1686
1745
  (link) => !hiddenSet?.has(link.label)
1687
1746
  );
@@ -1694,7 +1753,7 @@ var TopNav = async ({
1694
1753
  return /* @__PURE__ */ jsx(
1695
1754
  "div",
1696
1755
  {
1697
- className: "relative flex h-[165px] w-full items-start justify-center",
1756
+ className: "relative flex h-[280px] w-full items-start justify-center",
1698
1757
  style: {
1699
1758
  backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0) 33%), linear-gradient(${gradientStart}, ${gradientEnd})`,
1700
1759
  backgroundRepeat: "no-repeat",
@@ -1721,7 +1780,7 @@ var TopNav = async ({
1721
1780
  brandTitle ? /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-gray-900", children: brandTitle }) : null
1722
1781
  ] }) : /* @__PURE__ */ jsx("div", {}),
1723
1782
  /* @__PURE__ */ jsxs("details", { className: "group relative", children: [
1724
- /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 list-none", children: [
1783
+ /* @__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: [
1725
1784
  /* @__PURE__ */ jsxs(
1726
1785
  "svg",
1727
1786
  {
@@ -1793,12 +1852,12 @@ var TopNav = async ({
1793
1852
  const className = `flex items-center gap-2 px-4 py-1 transition text-gray-500 ${isActive ? "underline underline-offset-8 decoration-2" : ""}`;
1794
1853
  if (href) {
1795
1854
  return /* @__PURE__ */ jsxs(Link, { href, className, children: [
1796
- /* @__PURE__ */ jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1855
+ /* @__PURE__ */ jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1797
1856
  /* @__PURE__ */ jsx("span", { children: label })
1798
1857
  ] }, label);
1799
1858
  }
1800
1859
  return /* @__PURE__ */ jsxs("button", { className, type: "button", children: [
1801
- /* @__PURE__ */ jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1860
+ /* @__PURE__ */ jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1802
1861
  /* @__PURE__ */ jsx("span", { children: label })
1803
1862
  ] }, label);
1804
1863
  }) })
@@ -1806,7 +1865,7 @@ var TopNav = async ({
1806
1865
  }
1807
1866
  );
1808
1867
  };
1809
- var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
1868
+ var GlobeIcon = (props) => /* @__PURE__ */ jsx(
1810
1869
  "svg",
1811
1870
  {
1812
1871
  xmlns: "http://www.w3.org/2000/svg",
@@ -1814,16 +1873,14 @@ var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
1814
1873
  fill: "none",
1815
1874
  stroke: "currentColor",
1816
1875
  strokeWidth: 1.5,
1876
+ strokeLinecap: "round",
1877
+ strokeLinejoin: "round",
1817
1878
  "aria-hidden": "true",
1818
1879
  ...props,
1819
- children: [
1820
- /* @__PURE__ */ jsx("circle", { cx: 12, cy: 12, r: 10 }),
1821
- /* @__PURE__ */ jsx("path", { d: "M2 12h20" }),
1822
- /* @__PURE__ */ jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10Z" })
1823
- ]
1880
+ children: /* @__PURE__ */ jsx("path", { d: "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" })
1824
1881
  }
1825
1882
  );
1826
- var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
1883
+ var AirGapIcon = (props) => /* @__PURE__ */ jsx(
1827
1884
  "svg",
1828
1885
  {
1829
1886
  xmlns: "http://www.w3.org/2000/svg",
@@ -1831,15 +1888,11 @@ var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
1831
1888
  fill: "none",
1832
1889
  stroke: "currentColor",
1833
1890
  strokeWidth: 1.5,
1891
+ strokeLinecap: "round",
1892
+ strokeLinejoin: "round",
1834
1893
  "aria-hidden": "true",
1835
1894
  ...props,
1836
- children: [
1837
- /* @__PURE__ */ jsx("path", { d: "m4 4 16 16" }),
1838
- /* @__PURE__ */ jsx("path", { d: "M7.5 4.5a8 8 0 0 1 9 0" }),
1839
- /* @__PURE__ */ jsx("path", { d: "M4.5 7.5a8 8 0 0 0 0 9" }),
1840
- /* @__PURE__ */ jsx("path", { d: "M16.5 19.5a8 8 0 0 0 0-9" }),
1841
- /* @__PURE__ */ jsx("path", { d: "M7 12a5 5 0 0 0 5 5" })
1842
- ]
1895
+ children: /* @__PURE__ */ jsx("path", { d: "M13.181 8.68a4.503 4.503 0 0 1 1.903 6.405m-9.768-2.782L3.56 14.06a4.5 4.5 0 0 0 6.364 6.365l3.129-3.129m5.614-5.615 1.757-1.757a4.5 4.5 0 0 0-6.364-6.365l-4.5 4.5c-.258.26-.479.541-.661.84m1.903 6.405a4.495 4.495 0 0 1-1.242-.88 4.483 4.483 0 0 1-1.062-1.683m6.587 2.345 5.907 5.907m-5.907-5.907L8.898 8.898M2.991 2.99 8.898 8.9" })
1843
1896
  }
1844
1897
  );
1845
1898
  var baseCardClass = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -1880,7 +1933,7 @@ var UpdatesCard = ({
1880
1933
  /* @__PURE__ */ jsx("footer", { className: footerClass, children: /* @__PURE__ */ jsx(Link, { href: "/update", children: "View updates \u2192" }) })
1881
1934
  ] });
1882
1935
  UpdatesCard.displayName = "UpdatesCard";
1883
- var UploadIcon = (props) => /* @__PURE__ */ jsxs(
1936
+ var UploadIcon = (props) => /* @__PURE__ */ jsx(
1884
1937
  "svg",
1885
1938
  {
1886
1939
  xmlns: "http://www.w3.org/2000/svg",
@@ -1888,13 +1941,11 @@ var UploadIcon = (props) => /* @__PURE__ */ jsxs(
1888
1941
  fill: "none",
1889
1942
  stroke: "currentColor",
1890
1943
  strokeWidth: 1.5,
1944
+ strokeLinecap: "round",
1945
+ strokeLinejoin: "round",
1891
1946
  "aria-hidden": "true",
1892
1947
  ...props,
1893
- children: [
1894
- /* @__PURE__ */ jsx("path", { d: "M12 16V3" }),
1895
- /* @__PURE__ */ jsx("path", { d: "M8 7l4-4 4 4" }),
1896
- /* @__PURE__ */ jsx("path", { d: "M5 21h14" })
1897
- ]
1948
+ children: /* @__PURE__ */ jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" })
1898
1949
  }
1899
1950
  );
1900
1951
  var baseCardClass2 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -2301,7 +2352,7 @@ var UserSettingsCard = () => /* @__PURE__ */ jsxs("section", { className: baseCa
2301
2352
  /* @__PURE__ */ jsx("footer", { className: footerClass3, children: /* @__PURE__ */ jsx(Link, { href: "/user-settings", children: "View user settings \u2192" }) })
2302
2353
  ] });
2303
2354
  UserSettingsCard.displayName = "UserSettingsCard";
2304
- var UsersIcon = (props) => /* @__PURE__ */ jsxs(
2355
+ var UsersIcon = (props) => /* @__PURE__ */ jsx(
2305
2356
  "svg",
2306
2357
  {
2307
2358
  xmlns: "http://www.w3.org/2000/svg",
@@ -2309,17 +2360,14 @@ var UsersIcon = (props) => /* @__PURE__ */ jsxs(
2309
2360
  fill: "none",
2310
2361
  stroke: "currentColor",
2311
2362
  strokeWidth: 1.5,
2363
+ strokeLinecap: "round",
2364
+ strokeLinejoin: "round",
2312
2365
  "aria-hidden": "true",
2313
2366
  ...props,
2314
- children: [
2315
- /* @__PURE__ */ jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }),
2316
- /* @__PURE__ */ jsx("circle", { cx: 10, cy: 8, r: 4 }),
2317
- /* @__PURE__ */ jsx("path", { d: "M20 21v-2a4 4 0 0 0-3-3.87" }),
2318
- /* @__PURE__ */ jsx("path", { d: "M17 3a4 4 0 0 1 0 8" })
2319
- ]
2367
+ children: /* @__PURE__ */ jsx("path", { d: "M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" })
2320
2368
  }
2321
2369
  );
2322
- var KeyIcon = (props) => /* @__PURE__ */ jsxs(
2370
+ var KeyIcon = (props) => /* @__PURE__ */ jsx(
2323
2371
  "svg",
2324
2372
  {
2325
2373
  xmlns: "http://www.w3.org/2000/svg",
@@ -2327,13 +2375,11 @@ var KeyIcon = (props) => /* @__PURE__ */ jsxs(
2327
2375
  fill: "none",
2328
2376
  stroke: "currentColor",
2329
2377
  strokeWidth: 1.5,
2378
+ strokeLinecap: "round",
2379
+ strokeLinejoin: "round",
2330
2380
  "aria-hidden": "true",
2331
2381
  ...props,
2332
- children: [
2333
- /* @__PURE__ */ jsx("circle", { cx: 7, cy: 15, r: 4 }),
2334
- /* @__PURE__ */ jsx("path", { d: "m10.85 12.15 4.3-4.3a2 2 0 0 1 2.83 0l.47.47a2 2 0 0 1 0 2.83l-4.3 4.3" }),
2335
- /* @__PURE__ */ jsx("path", { d: "M16 11l1.5 1.5" })
2336
- ]
2382
+ children: /* @__PURE__ */ jsx("path", { d: "M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z" })
2337
2383
  }
2338
2384
  );
2339
2385
  var baseCardClass4 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -2379,6 +2425,6 @@ UpdateLayout.displayName = "UpdateLayout";
2379
2425
  // src/index.ts
2380
2426
  var portalComponentsVersion = package_default.version;
2381
2427
 
2382
- export { Button, LicenseDetails, SupportCard, TeamSettingsCard, TopNav, UpdateLayout, UpdatesCard, UserSettings, UserSettingsCard, createPortalTheme, decodeJwtPayload, defaultTopNavLinks, defineServerAction, deleteSupportBundle, downloadSupportBundle, fetchCurrentUser, fetchCustomBranding, fetchLicenseDetails, fetchNotifications, getCustomerIdFromToken, getSecurityInfo, getSecurityInfoDiff, getSecurityInfoSBOM, getSupportBundleUploadUrl, initiateLogin, listReleases, listSupportBundles, portalComponentsVersion, portalThemeTokens, updateNotifications, updateUser, uploadSupportBundle, verifyMagicLink };
2428
+ export { Button, LicenseDetails, SupportCard, TeamSettingsCard, TopNav, UpdateLayout, UpdatesCard, UserSettings, UserSettingsCard, createPortalTheme, decodeJwtPayload, defaultTopNavLinks, defineServerAction, deleteSupportBundle, downloadSupportBundle, fetchCurrentUser, fetchCustomBranding, fetchDashboardComposite, fetchLicenseDetails, fetchNotifications, getCustomerIdFromToken, getSecurityInfo, getSecurityInfoDiff, getSecurityInfoSBOM, getSupportBundleUploadUrl, initiateLogin, listReleases, listSupportBundles, portalComponentsVersion, portalThemeTokens, updateNotifications, updateUser, uploadSupportBundle, verifyMagicLink };
2383
2429
  //# sourceMappingURL=index.js.map
2384
2430
  //# sourceMappingURL=index.js.map