@replicated/portal-components 0.0.24 → 0.0.26

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 (180) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/branding-actions.js +6 -4
  4. package/dist/actions/branding-actions.js.map +1 -1
  5. package/dist/actions/change-team.js +1 -0
  6. package/dist/actions/change-team.js.map +1 -1
  7. package/dist/actions/index.d.mts +1 -1
  8. package/dist/actions/index.d.ts +1 -1
  9. package/dist/actions/index.js +1 -53
  10. package/dist/actions/index.js.map +1 -1
  11. package/dist/actions/install-actions.d.mts +1 -1
  12. package/dist/actions/install-actions.d.ts +1 -1
  13. package/dist/actions/install-actions.js +1 -0
  14. package/dist/actions/install-actions.js.map +1 -1
  15. package/dist/actions/invite-actions.js +6 -5
  16. package/dist/actions/invite-actions.js.map +1 -1
  17. package/dist/actions/magic-link-actions.js +6 -5
  18. package/dist/actions/magic-link-actions.js.map +1 -1
  19. package/dist/actions/service-account.d.mts +1 -1
  20. package/dist/actions/service-account.d.ts +1 -1
  21. package/dist/actions/service-account.js +1 -0
  22. package/dist/actions/service-account.js.map +1 -1
  23. package/dist/actions/support-bundles.d.mts +1 -1
  24. package/dist/actions/support-bundles.d.ts +1 -1
  25. package/dist/actions/support-bundles.js +1 -50
  26. package/dist/actions/support-bundles.js.map +1 -1
  27. package/dist/actions/team-settings.d.mts +1 -1
  28. package/dist/actions/team-settings.d.ts +1 -1
  29. package/dist/actions/team-settings.js +1 -0
  30. package/dist/actions/team-settings.js.map +1 -1
  31. package/dist/actions/trial-signup-actions.js +6 -5
  32. package/dist/actions/trial-signup-actions.js.map +1 -1
  33. package/dist/actions/trial-signup.js +6 -5
  34. package/dist/actions/trial-signup.js.map +1 -1
  35. package/dist/actions/user-settings.d.mts +1 -1
  36. package/dist/actions/user-settings.d.ts +1 -1
  37. package/dist/actions/user-settings.js +1 -0
  38. package/dist/actions/user-settings.js.map +1 -1
  39. package/dist/airgap-instances.d.mts +1 -1
  40. package/dist/airgap-instances.d.ts +1 -1
  41. package/dist/airgap-instances.js +25 -25
  42. package/dist/airgap-instances.js.map +1 -1
  43. package/dist/{saml-handlers.d.mts → api/saml.d.mts} +2 -2
  44. package/dist/{saml-handlers.d.ts → api/saml.d.ts} +2 -2
  45. package/dist/{saml-handlers.js → api/saml.js} +4 -3
  46. package/dist/api/saml.js.map +1 -0
  47. package/dist/api/support-bundles.d.mts +22 -0
  48. package/dist/api/support-bundles.d.ts +22 -0
  49. package/dist/api/support-bundles.js +245 -0
  50. package/dist/api/support-bundles.js.map +1 -0
  51. package/dist/{branding-BsMSywts.d.mts → branding-DmsrDTNE.d.mts} +2 -1
  52. package/dist/{branding-BsMSywts.d.ts → branding-DmsrDTNE.d.ts} +2 -1
  53. package/dist/esm/actions/branding-actions.js +6 -4
  54. package/dist/esm/actions/branding-actions.js.map +1 -1
  55. package/dist/esm/actions/change-team.js +1 -0
  56. package/dist/esm/actions/change-team.js.map +1 -1
  57. package/dist/esm/actions/index.js +2 -53
  58. package/dist/esm/actions/index.js.map +1 -1
  59. package/dist/esm/actions/install-actions.js +1 -0
  60. package/dist/esm/actions/install-actions.js.map +1 -1
  61. package/dist/esm/actions/invite-actions.js +6 -5
  62. package/dist/esm/actions/invite-actions.js.map +1 -1
  63. package/dist/esm/actions/magic-link-actions.js +6 -5
  64. package/dist/esm/actions/magic-link-actions.js.map +1 -1
  65. package/dist/esm/actions/service-account.js +1 -0
  66. package/dist/esm/actions/service-account.js.map +1 -1
  67. package/dist/esm/actions/support-bundles.js +2 -50
  68. package/dist/esm/actions/support-bundles.js.map +1 -1
  69. package/dist/esm/actions/team-settings.js +1 -0
  70. package/dist/esm/actions/team-settings.js.map +1 -1
  71. package/dist/esm/actions/trial-signup-actions.js +6 -5
  72. package/dist/esm/actions/trial-signup-actions.js.map +1 -1
  73. package/dist/esm/actions/trial-signup.js +6 -5
  74. package/dist/esm/actions/trial-signup.js.map +1 -1
  75. package/dist/esm/actions/user-settings.js +1 -0
  76. package/dist/esm/actions/user-settings.js.map +1 -1
  77. package/dist/esm/airgap-instances.js +25 -25
  78. package/dist/esm/airgap-instances.js.map +1 -1
  79. package/dist/esm/{saml-handlers.js → api/saml.js} +4 -3
  80. package/dist/esm/api/saml.js.map +1 -0
  81. package/dist/esm/api/support-bundles.js +243 -0
  82. package/dist/esm/api/support-bundles.js.map +1 -0
  83. package/dist/esm/helm-install-wizard.js +1 -0
  84. package/dist/esm/helm-install-wizard.js.map +1 -1
  85. package/dist/esm/index.js +262 -220
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/install-actions.js +1 -0
  88. package/dist/esm/install-actions.js.map +1 -1
  89. package/dist/esm/instance-card.js +25 -25
  90. package/dist/esm/instance-card.js.map +1 -1
  91. package/dist/esm/license-details.js +1 -0
  92. package/dist/esm/license-details.js.map +1 -1
  93. package/dist/esm/linux-install-wizard.js +1 -0
  94. package/dist/esm/linux-install-wizard.js.map +1 -1
  95. package/dist/esm/logout-action.js +1 -1
  96. package/dist/esm/logout-action.js.map +1 -1
  97. package/dist/esm/logout-button.js +5 -7
  98. package/dist/esm/logout-button.js.map +1 -1
  99. package/dist/esm/online-instance-list.js +25 -25
  100. package/dist/esm/online-instance-list.js.map +1 -1
  101. package/dist/esm/saml-callback-client.js.map +1 -1
  102. package/dist/esm/support-card.js +1 -0
  103. package/dist/esm/support-card.js.map +1 -1
  104. package/dist/esm/top-nav.js +82 -79
  105. package/dist/esm/top-nav.js.map +1 -1
  106. package/dist/esm/update-layout.js +82 -79
  107. package/dist/esm/update-layout.js.map +1 -1
  108. package/dist/esm/upload-support-bundle-modal.js +46 -16
  109. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  110. package/dist/esm/utils/index.js +48 -6
  111. package/dist/esm/utils/index.js.map +1 -1
  112. package/dist/helm-install-wizard.d.mts +2 -2
  113. package/dist/helm-install-wizard.d.ts +2 -2
  114. package/dist/helm-install-wizard.js +1 -0
  115. package/dist/helm-install-wizard.js.map +1 -1
  116. package/dist/{index-DXy7RxOX.d.ts → index-Bcp17Mf3.d.ts} +1 -16
  117. package/dist/{index-JX9-CIMA.d.mts → index-DaH1bSuO.d.mts} +1 -16
  118. package/dist/index.d.mts +6 -5
  119. package/dist/index.d.ts +6 -5
  120. package/dist/index.js +262 -220
  121. package/dist/index.js.map +1 -1
  122. package/dist/install-actions.d.mts +2 -2
  123. package/dist/install-actions.d.ts +2 -2
  124. package/dist/install-actions.js +1 -0
  125. package/dist/install-actions.js.map +1 -1
  126. package/dist/instance-card.d.mts +1 -1
  127. package/dist/instance-card.d.ts +1 -1
  128. package/dist/instance-card.js +25 -25
  129. package/dist/instance-card.js.map +1 -1
  130. package/dist/license-details.js +1 -0
  131. package/dist/license-details.js.map +1 -1
  132. package/dist/linux-install-wizard.d.mts +2 -2
  133. package/dist/linux-install-wizard.d.ts +2 -2
  134. package/dist/linux-install-wizard.js +1 -0
  135. package/dist/linux-install-wizard.js.map +1 -1
  136. package/dist/logout-action.d.mts +1 -1
  137. package/dist/logout-action.d.ts +1 -1
  138. package/dist/logout-action.js +1 -1
  139. package/dist/logout-action.js.map +1 -1
  140. package/dist/logout-button.d.mts +1 -1
  141. package/dist/logout-button.d.ts +1 -1
  142. package/dist/logout-button.js +5 -7
  143. package/dist/logout-button.js.map +1 -1
  144. package/dist/online-instance-list.d.mts +1 -1
  145. package/dist/online-instance-list.d.ts +1 -1
  146. package/dist/online-instance-list.js +25 -25
  147. package/dist/online-instance-list.js.map +1 -1
  148. package/dist/pending-installations.d.mts +1 -1
  149. package/dist/pending-installations.d.ts +1 -1
  150. package/dist/saml-callback-client.d.mts +1 -1
  151. package/dist/saml-callback-client.d.ts +1 -1
  152. package/dist/saml-callback-client.js.map +1 -1
  153. package/dist/security-card.d.mts +1 -1
  154. package/dist/security-card.d.ts +1 -1
  155. package/dist/styles.css +4 -0
  156. package/dist/support-bundles-card.d.mts +1 -1
  157. package/dist/support-bundles-card.d.ts +1 -1
  158. package/dist/support-card.js +1 -0
  159. package/dist/support-card.js.map +1 -1
  160. package/dist/{top-nav-CEqw0KpO.d.ts → top-nav-8f2U69MF.d.ts} +1 -1
  161. package/dist/{top-nav-BUQAGoG1.d.mts → top-nav-B2yA3PC7.d.mts} +1 -1
  162. package/dist/top-nav.d.mts +2 -2
  163. package/dist/top-nav.d.ts +2 -2
  164. package/dist/top-nav.js +82 -79
  165. package/dist/top-nav.js.map +1 -1
  166. package/dist/update-layout.js +82 -79
  167. package/dist/update-layout.js.map +1 -1
  168. package/dist/upload-support-bundle-modal.d.mts +9 -9
  169. package/dist/upload-support-bundle-modal.d.ts +9 -9
  170. package/dist/upload-support-bundle-modal.js +46 -16
  171. package/dist/upload-support-bundle-modal.js.map +1 -1
  172. package/dist/upload-with-progress-D760HthX.d.mts +35 -0
  173. package/dist/upload-with-progress-D760HthX.d.ts +35 -0
  174. package/dist/utils/index.d.mts +4 -18
  175. package/dist/utils/index.d.ts +4 -18
  176. package/dist/utils/index.js +48 -6
  177. package/dist/utils/index.js.map +1 -1
  178. package/package.json +16 -6
  179. package/dist/esm/saml-handlers.js.map +0 -1
  180. package/dist/saml-handlers.js.map +0 -1
package/dist/index.js CHANGED
@@ -127,7 +127,7 @@ var init_tracer = __esm({
127
127
 
128
128
  // package.json
129
129
  var package_default = {
130
- version: "0.0.24"};
130
+ version: "0.0.26"};
131
131
 
132
132
  // src/tokens/index.ts
133
133
  var baseTokens = {
@@ -450,223 +450,6 @@ async function fetchLicenseCore() {
450
450
  var fetchLicenseImpl = react.cache(fetchLicenseCore);
451
451
  var fetchLicense = fetchLicenseImpl;
452
452
 
453
- // src/utils/constants.ts
454
- var DEFAULT_FAVICON = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E";
455
- var DEFAULT_PRIMARY_COLOR = "#4f46e5";
456
- var DEFAULT_SECONDARY_COLOR = "#6366f1";
457
- var isHttpApiOrigin = () => {
458
- return process.env.REPLICATED_APP_ORIGIN?.startsWith("http://") || false;
459
- };
460
-
461
- // src/utils/branding.ts
462
- var normalizeColor = (color) => {
463
- if (!color || typeof color !== "string") {
464
- return void 0;
465
- }
466
- const trimmed = color.trim();
467
- if (/^#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(trimmed)) {
468
- return trimmed.startsWith("#") ? trimmed : `#${trimmed}`;
469
- }
470
- console.debug("[portal-components] Invalid color format rejected (only hex supported):", trimmed);
471
- return void 0;
472
- };
473
- var sanitizeUrlForCss = (url) => {
474
- if (!url || typeof url !== "string") {
475
- return void 0;
476
- }
477
- const trimmed = url.trim();
478
- try {
479
- const urlObj = new URL(trimmed);
480
- if (!["http:", "https:", "data:"].includes(urlObj.protocol)) {
481
- console.debug("[portal-components] Invalid URL protocol for background image:", urlObj.protocol);
482
- return void 0;
483
- }
484
- } catch {
485
- console.debug("[portal-components] Invalid URL format for background image:", trimmed);
486
- return void 0;
487
- }
488
- const escaped = trimmed.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/"/g, '\\"').replace(/'/g, "\\'").replace(/[\x00-\x1F\x7F]/g, "");
489
- return escaped;
490
- };
491
- var decodeBranding = ({ brandingData }) => {
492
- if (!brandingData || typeof brandingData !== "string") {
493
- return {
494
- primaryColor: DEFAULT_PRIMARY_COLOR,
495
- secondaryColor: DEFAULT_SECONDARY_COLOR
496
- };
497
- }
498
- try {
499
- const decoded = buffer.Buffer.from(brandingData, "base64").toString("utf-8");
500
- const parsed = JSON.parse(decoded);
501
- const logo = typeof parsed.logo === "string" ? parsed.logo : void 0;
502
- const titleRaw = typeof parsed.title === "string" ? parsed.title.trim() : "";
503
- const title = titleRaw ? titleRaw : void 0;
504
- const favicon = typeof parsed.favicon === "string" ? parsed.favicon : void 0;
505
- const primaryColorRaw = parsed.primaryColor ?? parsed.primary_color;
506
- const secondaryColorRaw = parsed.secondaryColor ?? parsed.secondary_color;
507
- const primaryColor = normalizeColor(primaryColorRaw);
508
- const secondaryColor = normalizeColor(secondaryColorRaw);
509
- const supportPortalLink = typeof parsed.supportPortalLink === "string" ? parsed.supportPortalLink : void 0;
510
- const backgroundRaw = parsed.background;
511
- const background = backgroundRaw === "minimal" || backgroundRaw === "custom" || backgroundRaw === "image" ? backgroundRaw : void 0;
512
- const backgroundImage = sanitizeUrlForCss(parsed.backgroundImage);
513
- const backgroundGradientStart = normalizeColor(parsed.customColor1);
514
- const backgroundGradientEnd = normalizeColor(parsed.customColor2);
515
- return {
516
- logo,
517
- title,
518
- favicon,
519
- primaryColor: primaryColor || DEFAULT_PRIMARY_COLOR,
520
- secondaryColor: secondaryColor || DEFAULT_SECONDARY_COLOR,
521
- supportPortalLink,
522
- background,
523
- backgroundImage,
524
- backgroundGradientStart,
525
- backgroundGradientEnd
526
- };
527
- } catch (error) {
528
- console.debug("[portal-components] unable to parse branding JSON", error);
529
- return {
530
- primaryColor: DEFAULT_PRIMARY_COLOR,
531
- secondaryColor: DEFAULT_SECONDARY_COLOR
532
- };
533
- }
534
- };
535
-
536
- // src/utils/session.ts
537
- async function validateSession(token) {
538
- if (!token || typeof token !== "string" || !token.trim()) {
539
- return false;
540
- }
541
- const endpoint = `${getApiOrigin()}/enterprise-portal/user`;
542
- const response = await fetch(endpoint, {
543
- method: "GET",
544
- headers: {
545
- authorization: `Bearer ${token}`
546
- },
547
- // Short timeout for validation
548
- signal: AbortSignal.timeout(5e3)
549
- });
550
- if (response.status === 401) {
551
- return false;
552
- }
553
- if (!response.ok) {
554
- throw new Error(`Session validation failed with status ${response.status}`);
555
- }
556
- return true;
557
- }
558
- async function deleteSessionCookie() {
559
- const { cookies: cookies2 } = await import('next/headers');
560
- const cookieStore = await cookies2();
561
- cookieStore.delete("portal_session");
562
- }
563
-
564
- // src/utils/format.ts
565
- function formatBytes(bytes, decimals = 1) {
566
- if (bytes === 0) return "0 Bytes";
567
- const k = 1024;
568
- const dm = decimals < 0 ? 0 : decimals;
569
- const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
570
- const i = Math.floor(Math.log(bytes) / Math.log(k));
571
- return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
572
- }
573
- function formatDateShort(dateString) {
574
- if (!dateString) return "Never";
575
- const date = new Date(dateString);
576
- if (isNaN(date.getTime())) {
577
- return dateString;
578
- }
579
- return date.toLocaleDateString("en-US", {
580
- year: "numeric",
581
- month: "2-digit",
582
- day: "2-digit"
583
- });
584
- }
585
- function formatDate(dateString) {
586
- if (!dateString) return "Never";
587
- const date = new Date(dateString);
588
- if (isNaN(date.getTime())) {
589
- return dateString;
590
- }
591
- return date.toLocaleDateString("en-US", {
592
- month: "short",
593
- day: "numeric",
594
- year: "numeric",
595
- hour: "numeric",
596
- minute: "2-digit",
597
- hour12: true
598
- });
599
- }
600
- function formatDateTime(dateString) {
601
- const date = new Date(dateString);
602
- if (isNaN(date.getTime())) {
603
- return dateString;
604
- }
605
- return date.toLocaleString("en-US", {
606
- timeZone: "UTC",
607
- year: "numeric",
608
- month: "2-digit",
609
- day: "2-digit",
610
- hour: "2-digit",
611
- minute: "2-digit",
612
- second: "2-digit",
613
- hour12: false
614
- }) + " UTC";
615
- }
616
- function formatDateTimeLocal(dateString) {
617
- if (!dateString) return "N/A";
618
- try {
619
- const date = new Date(dateString);
620
- if (isNaN(date.getTime())) {
621
- return dateString;
622
- }
623
- return date.toLocaleDateString("en-US", {
624
- month: "numeric",
625
- day: "numeric",
626
- year: "numeric",
627
- hour: "numeric",
628
- minute: "2-digit",
629
- hour12: true
630
- });
631
- } catch {
632
- return "N/A";
633
- }
634
- }
635
-
636
- // src/utils/release-helpers.ts
637
- function convertToReleaseEntry(release, channelName, options) {
638
- const sections = [];
639
- if (release.release_notes && release.release_notes.trim().length > 0) {
640
- if (options.releaseNotesMode === "markdown") {
641
- sections.push({
642
- title: "Release Notes",
643
- description: release.release_notes
644
- });
645
- } else {
646
- const releaseNotesItems = release.release_notes.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
647
- sections.push({
648
- title: "Release Notes",
649
- description: releaseNotesItems.length === 0 ? release.release_notes : void 0,
650
- items: releaseNotesItems.length > 0 ? releaseNotesItems : void 0
651
- });
652
- }
653
- }
654
- const charts = release.helm_charts ? release.helm_charts.filter((chart) => !chart.is_kots_installer_only).map((chart) => `${chart.name} v${chart.version}`) : [];
655
- if (charts.length > 0) {
656
- sections.push({
657
- title: "Helm Charts",
658
- items: charts,
659
- description: "Latest chart versions included in this release."
660
- });
661
- }
662
- return {
663
- version: release.label || `Release ${release.release_sequence}`,
664
- channel: channelName || `Channel ${release.channel_sequence}`,
665
- releasedAt: release.release_date,
666
- sections
667
- };
668
- }
669
-
670
453
  // src/actions/index.ts
671
454
  var getApiOrigin = () => {
672
455
  return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
@@ -809,6 +592,7 @@ var fetchCustomBrandingImpl = async () => {
809
592
  title: payload.title,
810
593
  primaryColor: payload.primaryColor,
811
594
  secondaryColor: payload.secondaryColor,
595
+ contact: payload.contact,
812
596
  favicon: payload.faviconUrl,
813
597
  supportPortalLink: payload.supportPortalLink || "",
814
598
  background: payload.background,
@@ -1751,6 +1535,91 @@ var LicenseDetails = async ({
1751
1535
  ] })
1752
1536
  ] });
1753
1537
  };
1538
+
1539
+ // src/utils/constants.ts
1540
+ var DEFAULT_FAVICON = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E";
1541
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
1542
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
1543
+ var isHttpApiOrigin = () => {
1544
+ return process.env.REPLICATED_APP_ORIGIN?.startsWith("http://") || false;
1545
+ };
1546
+
1547
+ // src/utils/branding.ts
1548
+ var normalizeColor = (color) => {
1549
+ if (!color || typeof color !== "string") {
1550
+ return void 0;
1551
+ }
1552
+ const trimmed = color.trim();
1553
+ if (/^#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(trimmed)) {
1554
+ return trimmed.startsWith("#") ? trimmed : `#${trimmed}`;
1555
+ }
1556
+ console.debug("[portal-components] Invalid color format rejected (only hex supported):", trimmed);
1557
+ return void 0;
1558
+ };
1559
+ var sanitizeUrlForCss = (url) => {
1560
+ if (!url || typeof url !== "string") {
1561
+ return void 0;
1562
+ }
1563
+ const trimmed = url.trim();
1564
+ try {
1565
+ const urlObj = new URL(trimmed);
1566
+ if (!["http:", "https:", "data:"].includes(urlObj.protocol)) {
1567
+ console.debug("[portal-components] Invalid URL protocol for background image:", urlObj.protocol);
1568
+ return void 0;
1569
+ }
1570
+ } catch {
1571
+ console.debug("[portal-components] Invalid URL format for background image:", trimmed);
1572
+ return void 0;
1573
+ }
1574
+ const escaped = trimmed.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/"/g, '\\"').replace(/'/g, "\\'").replace(/[\x00-\x1F\x7F]/g, "");
1575
+ return escaped;
1576
+ };
1577
+ var decodeBranding = ({ brandingData }) => {
1578
+ if (!brandingData || typeof brandingData !== "string") {
1579
+ return {
1580
+ primaryColor: DEFAULT_PRIMARY_COLOR,
1581
+ secondaryColor: DEFAULT_SECONDARY_COLOR
1582
+ };
1583
+ }
1584
+ try {
1585
+ const decoded = buffer.Buffer.from(brandingData, "base64").toString("utf-8");
1586
+ const parsed = JSON.parse(decoded);
1587
+ const logo = typeof parsed.logo === "string" ? parsed.logo : void 0;
1588
+ const titleRaw = typeof parsed.title === "string" ? parsed.title.trim() : "";
1589
+ const title = titleRaw ? titleRaw : void 0;
1590
+ const favicon = typeof parsed.favicon === "string" ? parsed.favicon : void 0;
1591
+ const primaryColorRaw = parsed.primaryColor ?? parsed.primary_color;
1592
+ const secondaryColorRaw = parsed.secondaryColor ?? parsed.secondary_color;
1593
+ const primaryColor = normalizeColor(primaryColorRaw);
1594
+ const secondaryColor = normalizeColor(secondaryColorRaw);
1595
+ const contact = typeof parsed.contact === "string" ? parsed.contact : void 0;
1596
+ const supportPortalLink = typeof parsed.supportPortalLink === "string" ? parsed.supportPortalLink : void 0;
1597
+ const backgroundRaw = parsed.background;
1598
+ const background = backgroundRaw === "minimal" || backgroundRaw === "custom" || backgroundRaw === "image" ? backgroundRaw : void 0;
1599
+ const backgroundImage = sanitizeUrlForCss(parsed.backgroundImage);
1600
+ const backgroundGradientStart = normalizeColor(parsed.customColor1);
1601
+ const backgroundGradientEnd = normalizeColor(parsed.customColor2);
1602
+ return {
1603
+ logo,
1604
+ title,
1605
+ favicon,
1606
+ primaryColor: primaryColor || DEFAULT_PRIMARY_COLOR,
1607
+ secondaryColor: secondaryColor || DEFAULT_SECONDARY_COLOR,
1608
+ contact,
1609
+ supportPortalLink,
1610
+ background,
1611
+ backgroundImage,
1612
+ backgroundGradientStart,
1613
+ backgroundGradientEnd
1614
+ };
1615
+ } catch (error) {
1616
+ console.debug("[portal-components] unable to parse branding JSON", error);
1617
+ return {
1618
+ primaryColor: DEFAULT_PRIMARY_COLOR,
1619
+ secondaryColor: DEFAULT_SECONDARY_COLOR
1620
+ };
1621
+ }
1622
+ };
1754
1623
  function UserMenuDropdown({
1755
1624
  displayLabel,
1756
1625
  children,
@@ -2679,7 +2548,180 @@ var UpdateLayout = ({ children }) => {
2679
2548
  };
2680
2549
  UpdateLayout.displayName = "UpdateLayout";
2681
2550
 
2682
- // src/saml-handlers.ts
2551
+ // src/utils/session.ts
2552
+ async function validateSession(token) {
2553
+ if (!token || typeof token !== "string" || !token.trim()) {
2554
+ return false;
2555
+ }
2556
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user`;
2557
+ const response = await fetch(endpoint, {
2558
+ method: "GET",
2559
+ headers: {
2560
+ authorization: `Bearer ${token}`
2561
+ },
2562
+ // Short timeout for validation
2563
+ signal: AbortSignal.timeout(5e3)
2564
+ });
2565
+ if (response.status === 401) {
2566
+ return false;
2567
+ }
2568
+ if (!response.ok) {
2569
+ throw new Error(`Session validation failed with status ${response.status}`);
2570
+ }
2571
+ return true;
2572
+ }
2573
+
2574
+ // src/utils/format.ts
2575
+ function formatBytes(bytes, decimals = 1) {
2576
+ if (bytes === 0) return "0 Bytes";
2577
+ const k = 1024;
2578
+ const dm = decimals < 0 ? 0 : decimals;
2579
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
2580
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
2581
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
2582
+ }
2583
+ function formatDateShort(dateString) {
2584
+ if (!dateString) return "Never";
2585
+ const date = new Date(dateString);
2586
+ if (isNaN(date.getTime())) {
2587
+ return dateString;
2588
+ }
2589
+ return date.toLocaleDateString("en-US", {
2590
+ year: "numeric",
2591
+ month: "2-digit",
2592
+ day: "2-digit"
2593
+ });
2594
+ }
2595
+ function formatDate(dateString) {
2596
+ if (!dateString) return "Never";
2597
+ const date = new Date(dateString);
2598
+ if (isNaN(date.getTime())) {
2599
+ return dateString;
2600
+ }
2601
+ return date.toLocaleDateString("en-US", {
2602
+ month: "short",
2603
+ day: "numeric",
2604
+ year: "numeric",
2605
+ hour: "numeric",
2606
+ minute: "2-digit",
2607
+ hour12: true
2608
+ });
2609
+ }
2610
+ function formatDateTime(dateString) {
2611
+ const date = new Date(dateString);
2612
+ if (isNaN(date.getTime())) {
2613
+ return dateString;
2614
+ }
2615
+ return date.toLocaleString("en-US", {
2616
+ timeZone: "UTC",
2617
+ year: "numeric",
2618
+ month: "2-digit",
2619
+ day: "2-digit",
2620
+ hour: "2-digit",
2621
+ minute: "2-digit",
2622
+ second: "2-digit",
2623
+ hour12: false
2624
+ }) + " UTC";
2625
+ }
2626
+ function formatDateTimeLocal(dateString) {
2627
+ if (!dateString) return "N/A";
2628
+ try {
2629
+ const date = new Date(dateString);
2630
+ if (isNaN(date.getTime())) {
2631
+ return dateString;
2632
+ }
2633
+ return date.toLocaleDateString("en-US", {
2634
+ month: "numeric",
2635
+ day: "numeric",
2636
+ year: "numeric",
2637
+ hour: "numeric",
2638
+ minute: "2-digit",
2639
+ hour12: true
2640
+ });
2641
+ } catch {
2642
+ return "N/A";
2643
+ }
2644
+ }
2645
+
2646
+ // src/utils/release-helpers.ts
2647
+ function convertToReleaseEntry(release, channelName, options) {
2648
+ const sections = [];
2649
+ if (release.release_notes && release.release_notes.trim().length > 0) {
2650
+ if (options.releaseNotesMode === "markdown") {
2651
+ sections.push({
2652
+ title: "Release Notes",
2653
+ description: release.release_notes
2654
+ });
2655
+ } else {
2656
+ const releaseNotesItems = release.release_notes.split(/\r?\n/).map((line) => line.trim()).filter((line) => line.length > 0);
2657
+ sections.push({
2658
+ title: "Release Notes",
2659
+ description: releaseNotesItems.length === 0 ? release.release_notes : void 0,
2660
+ items: releaseNotesItems.length > 0 ? releaseNotesItems : void 0
2661
+ });
2662
+ }
2663
+ }
2664
+ const charts = release.helm_charts ? release.helm_charts.filter((chart) => !chart.is_kots_installer_only).map((chart) => `${chart.name} v${chart.version}`) : [];
2665
+ if (charts.length > 0) {
2666
+ sections.push({
2667
+ title: "Helm Charts",
2668
+ items: charts,
2669
+ description: "Latest chart versions included in this release."
2670
+ });
2671
+ }
2672
+ return {
2673
+ version: release.label || `Release ${release.release_sequence}`,
2674
+ channel: channelName || `Channel ${release.channel_sequence}`,
2675
+ releasedAt: release.release_date,
2676
+ sections
2677
+ };
2678
+ }
2679
+
2680
+ // src/utils/upload-with-progress.ts
2681
+ async function uploadSupportBundleWithProgress(file, appId, onProgress, signal) {
2682
+ return new Promise((resolve, reject) => {
2683
+ const xhr = new XMLHttpRequest();
2684
+ xhr.upload.addEventListener("progress", (e) => {
2685
+ if (e.lengthComputable) {
2686
+ const percent = Math.round(e.loaded / e.total * 100);
2687
+ onProgress(percent);
2688
+ }
2689
+ });
2690
+ xhr.addEventListener("load", () => {
2691
+ if (xhr.status === 200) {
2692
+ try {
2693
+ const response = JSON.parse(xhr.responseText);
2694
+ resolve(response);
2695
+ } catch (err) {
2696
+ reject(new Error("Failed to parse server response"));
2697
+ }
2698
+ } else {
2699
+ try {
2700
+ const response = JSON.parse(xhr.responseText);
2701
+ reject(new Error(response.error || `Upload failed: ${xhr.status}`));
2702
+ } catch {
2703
+ reject(new Error(`Upload failed: ${xhr.status} ${xhr.statusText}`));
2704
+ }
2705
+ }
2706
+ });
2707
+ xhr.addEventListener("error", () => {
2708
+ reject(new Error("Network error. Please check your connection."));
2709
+ });
2710
+ xhr.addEventListener("abort", () => {
2711
+ reject(new Error("Upload cancelled"));
2712
+ });
2713
+ signal.addEventListener("abort", () => {
2714
+ xhr.abort();
2715
+ });
2716
+ const basePath = process.env.NEXT_PUBLIC_BASE_PATH || "";
2717
+ const uploadUrl = `${basePath}/api/support-bundles/upload?appId=${encodeURIComponent(appId)}`;
2718
+ xhr.open("POST", uploadUrl, true);
2719
+ xhr.setRequestHeader("Content-Type", "application/gzip");
2720
+ xhr.send(file);
2721
+ });
2722
+ }
2723
+
2724
+ // src/api/saml.ts
2683
2725
  async function setSamlSessionImpl(token) {
2684
2726
  try {
2685
2727
  if (!token) {
@@ -2767,7 +2809,6 @@ exports.decodeBranding = decodeBranding;
2767
2809
  exports.decodeJwtPayload = decodeJwtPayload;
2768
2810
  exports.defaultTopNavLinks = defaultTopNavLinks;
2769
2811
  exports.defineServerAction = defineServerAction;
2770
- exports.deleteSessionCookie = deleteSessionCookie;
2771
2812
  exports.deleteSupportBundle = deleteSupportBundle;
2772
2813
  exports.downloadSecuritySBOM = downloadSecuritySBOM;
2773
2814
  exports.downloadSupportBundle = downloadSupportBundle;
@@ -2800,6 +2841,7 @@ exports.setSamlSessionImpl = setSamlSessionImpl;
2800
2841
  exports.updateNotifications = updateNotifications;
2801
2842
  exports.updateUser = updateUser;
2802
2843
  exports.uploadSupportBundle = uploadSupportBundle;
2844
+ exports.uploadSupportBundleWithProgress = uploadSupportBundleWithProgress;
2803
2845
  exports.validateSession = validateSession;
2804
2846
  exports.verifyMagicLink = verifyMagicLink;
2805
2847
  //# sourceMappingURL=index.js.map