@replicated/portal-components 0.0.19 → 0.0.21

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 (244) 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 +66 -7
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +3 -1
  6. package/dist/actions/index.d.ts +3 -1
  7. package/dist/actions/index.js +182 -465
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +3 -1
  10. package/dist/actions/install-actions.d.ts +3 -1
  11. package/dist/actions/install-actions.js +58 -5
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +3 -1
  14. package/dist/actions/service-account.d.ts +3 -1
  15. package/dist/actions/service-account.js +58 -5
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +3 -1
  18. package/dist/actions/support-bundles.d.ts +3 -1
  19. package/dist/actions/support-bundles.js +58 -5
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +3 -1
  22. package/dist/actions/team-settings.d.ts +3 -1
  23. package/dist/actions/team-settings.js +91 -27
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.d.mts +24 -0
  26. package/dist/actions/trial-signup.d.ts +24 -0
  27. package/dist/actions/trial-signup.js +482 -0
  28. package/dist/actions/trial-signup.js.map +1 -0
  29. package/dist/actions/user-settings.d.mts +3 -1
  30. package/dist/actions/user-settings.d.ts +3 -1
  31. package/dist/actions/user-settings.js +58 -5
  32. package/dist/actions/user-settings.js.map +1 -1
  33. package/dist/airgap-instances.d.mts +3 -1
  34. package/dist/airgap-instances.d.ts +3 -1
  35. package/dist/airgap-instances.js +41 -112
  36. package/dist/airgap-instances.js.map +1 -1
  37. package/dist/branding-BsMSywts.d.mts +36 -0
  38. package/dist/branding-BsMSywts.d.ts +36 -0
  39. package/dist/error-page.js +10 -2
  40. package/dist/error-page.js.map +1 -1
  41. package/dist/error.js +10 -2
  42. package/dist/error.js.map +1 -1
  43. package/dist/esm/actions/change-team.js +66 -7
  44. package/dist/esm/actions/change-team.js.map +1 -1
  45. package/dist/esm/actions/index.js +181 -462
  46. package/dist/esm/actions/index.js.map +1 -1
  47. package/dist/esm/actions/install-actions.js +58 -5
  48. package/dist/esm/actions/install-actions.js.map +1 -1
  49. package/dist/esm/actions/service-account.js +58 -5
  50. package/dist/esm/actions/service-account.js.map +1 -1
  51. package/dist/esm/actions/support-bundles.js +58 -5
  52. package/dist/esm/actions/support-bundles.js.map +1 -1
  53. package/dist/esm/actions/team-settings.js +91 -27
  54. package/dist/esm/actions/team-settings.js.map +1 -1
  55. package/dist/esm/actions/trial-signup.js +478 -0
  56. package/dist/esm/actions/trial-signup.js.map +1 -0
  57. package/dist/esm/actions/user-settings.js +58 -5
  58. package/dist/esm/actions/user-settings.js.map +1 -1
  59. package/dist/esm/airgap-instances.js +40 -112
  60. package/dist/esm/airgap-instances.js.map +1 -1
  61. package/dist/esm/error-page.js +10 -2
  62. package/dist/esm/error-page.js.map +1 -1
  63. package/dist/esm/error.js +10 -2
  64. package/dist/esm/error.js.map +1 -1
  65. package/dist/esm/helm-install-wizard.js +118 -79
  66. package/dist/esm/helm-install-wizard.js.map +1 -1
  67. package/dist/esm/index.js +706 -438
  68. package/dist/esm/index.js.map +1 -1
  69. package/dist/esm/install-actions.js +40 -5
  70. package/dist/esm/install-actions.js.map +1 -1
  71. package/dist/esm/install-card.js +9 -6
  72. package/dist/esm/install-card.js.map +1 -1
  73. package/dist/esm/install-targets.js +9 -2
  74. package/dist/esm/install-targets.js.map +1 -1
  75. package/dist/esm/instance-card.js +39 -111
  76. package/dist/esm/instance-card.js.map +1 -1
  77. package/dist/esm/join-team.js +9 -3
  78. package/dist/esm/join-team.js.map +1 -1
  79. package/dist/esm/license-card.js +24 -22
  80. package/dist/esm/license-card.js.map +1 -1
  81. package/dist/esm/license-details.js +128 -334
  82. package/dist/esm/license-details.js.map +1 -1
  83. package/dist/esm/linux-install-wizard.js +95 -41
  84. package/dist/esm/linux-install-wizard.js.map +1 -1
  85. package/dist/esm/login.js +20 -4
  86. package/dist/esm/login.js.map +1 -1
  87. package/dist/esm/middleware.js +33 -0
  88. package/dist/esm/middleware.js.map +1 -0
  89. package/dist/esm/online-instance-list.js +40 -112
  90. package/dist/esm/online-instance-list.js.map +1 -1
  91. package/dist/esm/release-history-panel.js +27 -14
  92. package/dist/esm/release-history-panel.js.map +1 -1
  93. package/dist/esm/saml-callback-client.js +82 -0
  94. package/dist/esm/saml-callback-client.js.map +1 -0
  95. package/dist/esm/saml-handlers.js +138 -0
  96. package/dist/esm/saml-handlers.js.map +1 -0
  97. package/dist/esm/security-card.js +53 -38
  98. package/dist/esm/security-card.js.map +1 -1
  99. package/dist/esm/service-accounts-tab.js +800 -0
  100. package/dist/esm/service-accounts-tab.js.map +1 -0
  101. package/dist/esm/support-bundle-collection-card.js +48 -24
  102. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  103. package/dist/esm/support-bundles-card.js +10 -5
  104. package/dist/esm/support-bundles-card.js.map +1 -1
  105. package/dist/esm/support-card.js +37 -5
  106. package/dist/esm/support-card.js.map +1 -1
  107. package/dist/esm/team-selection.js +5 -1
  108. package/dist/esm/team-selection.js.map +1 -1
  109. package/dist/esm/team-settings-card.js +5 -2
  110. package/dist/esm/team-settings-card.js.map +1 -1
  111. package/dist/esm/team-settings.js +7 -2
  112. package/dist/esm/team-settings.js.map +1 -1
  113. package/dist/esm/top-nav-user-menu.js +5 -1
  114. package/dist/esm/top-nav-user-menu.js.map +1 -1
  115. package/dist/esm/top-nav.js +175 -62
  116. package/dist/esm/top-nav.js.map +1 -1
  117. package/dist/esm/trial-signup.js +256 -0
  118. package/dist/esm/trial-signup.js.map +1 -0
  119. package/dist/esm/update-layout.js +175 -62
  120. package/dist/esm/update-layout.js.map +1 -1
  121. package/dist/esm/updates-card.js +15 -4
  122. package/dist/esm/updates-card.js.map +1 -1
  123. package/dist/esm/upload-support-bundle-modal.js +9 -4
  124. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  125. package/dist/esm/user-settings-card.js +5 -2
  126. package/dist/esm/user-settings-card.js.map +1 -1
  127. package/dist/esm/user-settings.js +12 -6
  128. package/dist/esm/user-settings.js.map +1 -1
  129. package/dist/esm/utils/index.js +204 -13
  130. package/dist/esm/utils/index.js.map +1 -1
  131. package/dist/fetch-license-iTyF7_GY.d.mts +81 -0
  132. package/dist/fetch-license-iTyF7_GY.d.ts +81 -0
  133. package/dist/helm-install-wizard.d.mts +11 -3
  134. package/dist/helm-install-wizard.d.ts +11 -3
  135. package/dist/helm-install-wizard.js +118 -79
  136. package/dist/helm-install-wizard.js.map +1 -1
  137. package/dist/{index-BAiVrSSR.d.mts → index-DyzJ0yKD.d.mts} +48 -50
  138. package/dist/{index-DWt-N5od.d.ts → index-sMbq94M7.d.ts} +48 -50
  139. package/dist/index.d.mts +8 -2
  140. package/dist/index.d.ts +8 -2
  141. package/dist/index.js +726 -438
  142. package/dist/index.js.map +1 -1
  143. package/dist/install-actions.d.mts +4 -2
  144. package/dist/install-actions.d.ts +4 -2
  145. package/dist/install-actions.js +40 -5
  146. package/dist/install-actions.js.map +1 -1
  147. package/dist/install-card.d.mts +2 -3
  148. package/dist/install-card.d.ts +2 -3
  149. package/dist/install-card.js +9 -6
  150. package/dist/install-card.js.map +1 -1
  151. package/dist/install-targets.js +9 -2
  152. package/dist/install-targets.js.map +1 -1
  153. package/dist/instance-card.d.mts +3 -1
  154. package/dist/instance-card.d.ts +3 -1
  155. package/dist/instance-card.js +40 -111
  156. package/dist/instance-card.js.map +1 -1
  157. package/dist/join-team.js +9 -3
  158. package/dist/join-team.js.map +1 -1
  159. package/dist/license-card.d.mts +2 -3
  160. package/dist/license-card.d.ts +2 -3
  161. package/dist/license-card.js +24 -22
  162. package/dist/license-card.js.map +1 -1
  163. package/dist/license-details.js +128 -334
  164. package/dist/license-details.js.map +1 -1
  165. package/dist/linux-install-wizard.d.mts +9 -3
  166. package/dist/linux-install-wizard.d.ts +9 -3
  167. package/dist/linux-install-wizard.js +95 -41
  168. package/dist/linux-install-wizard.js.map +1 -1
  169. package/dist/login.d.mts +4 -0
  170. package/dist/login.d.ts +4 -0
  171. package/dist/login.js +20 -4
  172. package/dist/login.js.map +1 -1
  173. package/dist/middleware.d.mts +13 -0
  174. package/dist/middleware.d.ts +13 -0
  175. package/dist/middleware.js +35 -0
  176. package/dist/middleware.js.map +1 -0
  177. package/dist/online-instance-list.d.mts +3 -1
  178. package/dist/online-instance-list.d.ts +3 -1
  179. package/dist/online-instance-list.js +41 -112
  180. package/dist/online-instance-list.js.map +1 -1
  181. package/dist/pending-installations.d.mts +3 -1
  182. package/dist/pending-installations.d.ts +3 -1
  183. package/dist/release-history-panel.js +27 -14
  184. package/dist/release-history-panel.js.map +1 -1
  185. package/dist/saml-callback-client.d.mts +36 -0
  186. package/dist/saml-callback-client.d.ts +36 -0
  187. package/dist/saml-callback-client.js +88 -0
  188. package/dist/saml-callback-client.js.map +1 -0
  189. package/dist/saml-handlers.d.mts +50 -0
  190. package/dist/saml-handlers.d.ts +50 -0
  191. package/dist/saml-handlers.js +141 -0
  192. package/dist/saml-handlers.js.map +1 -0
  193. package/dist/security-card.d.mts +3 -1
  194. package/dist/security-card.d.ts +3 -1
  195. package/dist/security-card.js +53 -38
  196. package/dist/security-card.js.map +1 -1
  197. package/dist/service-accounts-tab.d.mts +51 -0
  198. package/dist/service-accounts-tab.d.ts +51 -0
  199. package/dist/service-accounts-tab.js +802 -0
  200. package/dist/service-accounts-tab.js.map +1 -0
  201. package/dist/styles.css +375 -127
  202. package/dist/support-bundle-collection-card.d.mts +1 -1
  203. package/dist/support-bundle-collection-card.d.ts +1 -1
  204. package/dist/support-bundle-collection-card.js +47 -23
  205. package/dist/support-bundle-collection-card.js.map +1 -1
  206. package/dist/support-bundles-card.d.mts +4 -2
  207. package/dist/support-bundles-card.d.ts +4 -2
  208. package/dist/support-bundles-card.js +10 -5
  209. package/dist/support-bundles-card.js.map +1 -1
  210. package/dist/support-card.js +37 -5
  211. package/dist/support-card.js.map +1 -1
  212. package/dist/team-selection.js +5 -1
  213. package/dist/team-selection.js.map +1 -1
  214. package/dist/team-settings-card.js +5 -2
  215. package/dist/team-settings-card.js.map +1 -1
  216. package/dist/team-settings.js +7 -2
  217. package/dist/team-settings.js.map +1 -1
  218. package/dist/{top-nav-IRIn66wS.d.ts → top-nav-BUQAGoG1.d.mts} +14 -2
  219. package/dist/{top-nav-IRIn66wS.d.mts → top-nav-CEqw0KpO.d.ts} +14 -2
  220. package/dist/top-nav-user-menu.js +5 -1
  221. package/dist/top-nav-user-menu.js.map +1 -1
  222. package/dist/top-nav.d.mts +2 -1
  223. package/dist/top-nav.d.ts +2 -1
  224. package/dist/top-nav.js +175 -62
  225. package/dist/top-nav.js.map +1 -1
  226. package/dist/trial-signup.d.mts +31 -0
  227. package/dist/trial-signup.d.ts +31 -0
  228. package/dist/trial-signup.js +258 -0
  229. package/dist/trial-signup.js.map +1 -0
  230. package/dist/update-layout.js +175 -62
  231. package/dist/update-layout.js.map +1 -1
  232. package/dist/updates-card.js +15 -4
  233. package/dist/updates-card.js.map +1 -1
  234. package/dist/upload-support-bundle-modal.js +9 -4
  235. package/dist/upload-support-bundle-modal.js.map +1 -1
  236. package/dist/user-settings-card.js +5 -2
  237. package/dist/user-settings-card.js.map +1 -1
  238. package/dist/user-settings.js +12 -6
  239. package/dist/user-settings.js.map +1 -1
  240. package/dist/utils/index.d.mts +74 -16
  241. package/dist/utils/index.d.ts +74 -16
  242. package/dist/utils/index.js +215 -12
  243. package/dist/utils/index.js.map +1 -1
  244. package/package.json +37 -2
@@ -8,7 +8,40 @@ var buffer = require('buffer');
8
8
  * Enterprise Portal Components
9
9
  * This file is generated by tsup. Do not edit manually.
10
10
  */
11
+ var __defProp = Object.defineProperty;
12
+ var __export = (target, all) => {
13
+ for (var name in all)
14
+ __defProp(target, name, { get: all[name], enumerable: true });
15
+ };
16
+
17
+ // datadog/tracer.ts
18
+ var tracer_exports = {};
19
+ __export(tracer_exports, {
20
+ default: () => tracer_default
21
+ });
22
+ var tracer_default;
11
23
 
24
+ // src/utils/constants.ts
25
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
26
+ function useCopyToClipboard(resetDelay = 2e3) {
27
+ const [copied, setCopied] = react.useState(false);
28
+ const copy = react.useCallback(async (text) => {
29
+ if (!navigator.clipboard) {
30
+ console.warn("[useCopyToClipboard] Clipboard API not available");
31
+ return false;
32
+ }
33
+ try {
34
+ await navigator.clipboard.writeText(text);
35
+ setCopied(true);
36
+ setTimeout(() => setCopied(false), resetDelay);
37
+ return true;
38
+ } catch (error) {
39
+ console.error("[useCopyToClipboard] Failed to copy:", error);
40
+ return false;
41
+ }
42
+ }, [resetDelay]);
43
+ return { copy, copied };
44
+ }
12
45
  var navigateTo = (href) => {
13
46
  if (typeof window !== "undefined") {
14
47
  window.location.assign(href);
@@ -24,26 +57,12 @@ var K8S_DISTRIBUTIONS = [
24
57
  { value: "eks", label: "Amazon EKS" },
25
58
  { value: "gke", label: "Google GKE" }
26
59
  ];
27
- var copyToClipboard = async (text) => {
28
- try {
29
- await navigator.clipboard.writeText(text);
30
- return true;
31
- } catch {
32
- return false;
33
- }
34
- };
35
60
  var CodeBlock = ({
36
61
  command,
37
62
  className = ""
38
63
  }) => {
39
- const [copied, setCopied] = react.useState(false);
40
- const handleCopy = async () => {
41
- const success = await copyToClipboard(command);
42
- if (success) {
43
- setCopied(true);
44
- setTimeout(() => setCopied(false), 2e3);
45
- }
46
- };
64
+ const { copy, copied } = useCopyToClipboard();
65
+ const handleCopy = () => copy(command);
47
66
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `group relative min-w-0 ${className}`, children: [
48
67
  /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "overflow-x-auto rounded-lg bg-gray-900 p-4 text-sm text-gray-100", children: /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block", children: command }) }),
49
68
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -58,11 +77,12 @@ var CodeBlock = ({
58
77
  )
59
78
  ] });
60
79
  };
61
- var StepIndicator = ({ step }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-3", children: [
80
+ var StepIndicator = ({ step, primaryColor = DEFAULT_SECONDARY_COLOR }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-3", children: [
62
81
  /* @__PURE__ */ jsxRuntime.jsx(
63
82
  "div",
64
83
  {
65
- className: `flex h-10 w-10 items-center justify-center rounded-full border-2 ${step > 1 ? "border-gray-900 bg-gray-900 text-white" : "border-indigo-500"}`,
84
+ className: `flex h-10 w-10 items-center justify-center rounded-full border-2 ${step > 1 ? "border-gray-900 bg-gray-900 text-white" : ""}`,
85
+ style: step === 1 ? { borderColor: primaryColor } : void 0,
66
86
  children: step > 1 ? /* @__PURE__ */ jsxRuntime.jsx(
67
87
  "svg",
68
88
  {
@@ -74,7 +94,7 @@ var StepIndicator = ({ step }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { class
74
94
  strokeWidth: "2",
75
95
  children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m3.5 8 3 3 6-6" })
76
96
  }
77
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-2.5 w-2.5 rounded-full bg-indigo-500" })
97
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: { backgroundColor: primaryColor } })
78
98
  }
79
99
  ),
80
100
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-0.5 w-12 ${step > 1 ? "bg-gray-900" : "bg-gray-200"}` }),
@@ -92,11 +112,12 @@ var VersionDropdown = ({
92
112
  onSelect,
93
113
  isLoading,
94
114
  isLoadingInstructions,
95
- error
115
+ error,
116
+ primaryColor = DEFAULT_SECONDARY_COLOR
96
117
  }) => {
97
118
  if (isLoading) {
98
119
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-8 flex items-center gap-2 text-sm text-gray-500", children: [
99
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
120
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
100
121
  "Loading versions..."
101
122
  ] });
102
123
  }
@@ -112,7 +133,7 @@ var VersionDropdown = ({
112
133
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-8 space-y-2", children: [
113
134
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm text-gray-600", children: [
114
135
  "App Version",
115
- isLoadingInstructions && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" })
136
+ isLoadingInstructions && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } })
116
137
  ] }),
117
138
  /* @__PURE__ */ jsxRuntime.jsx(
118
139
  "select",
@@ -165,11 +186,12 @@ var InstallationInstructions = ({
165
186
  isLoading,
166
187
  completedSteps = {},
167
188
  registryAccess = "online",
168
- networkAvailability = "online"
189
+ networkAvailability = "online",
190
+ primaryColor = DEFAULT_SECONDARY_COLOR
169
191
  }) => {
170
192
  if (isLoading && !instructions?.steps?.length) {
171
193
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500", children: [
172
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
194
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
173
195
  "Loading instructions..."
174
196
  ] }) });
175
197
  }
@@ -178,13 +200,13 @@ var InstallationInstructions = ({
178
200
  }
179
201
  const completableStepNames = ["export_credentials", "install_chart"];
180
202
  const stepOffset = networkAvailability === "airgap" ? 3 : 2;
181
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `min-w-0 space-y-4 transition-opacity duration-150 ${isLoading ? "opacity-60" : ""}`, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "min-w-0 space-y-6 text-sm text-gray-700", children: instructions.steps.map((step, index) => {
203
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `min-w-0 space-y-4 transition-opacity duration-200 ${isLoading ? "opacity-60" : ""}`, children: /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "min-w-0 space-y-6 text-sm text-gray-700", children: instructions.steps.map((step, index) => {
182
204
  const canComplete = step.maybe_completed || completableStepNames.includes(step.step_name);
183
205
  const isCompleted = canComplete && completedSteps[step.step_name];
184
206
  const isPartialInstallChart = registryAccess === "partial" && step.step_name === "install_chart";
185
207
  return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "space-y-2", children: [
186
208
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
187
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold text-indigo-500", children: index + stepOffset }),
209
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: index + stepOffset }),
188
210
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-gray-900", children: step.title }),
189
211
  canComplete && /* @__PURE__ */ jsxRuntime.jsx(
190
212
  "span",
@@ -218,6 +240,8 @@ var InstallationInstructions = ({
218
240
  };
219
241
  var HelmInstallWizard = ({
220
242
  token,
243
+ primaryColor = DEFAULT_SECONDARY_COLOR,
244
+ secondaryColor = DEFAULT_SECONDARY_COLOR,
221
245
  createServiceAccountAction,
222
246
  fetchChannelReleasesAction,
223
247
  createInstallOptionsAction,
@@ -229,7 +253,8 @@ var HelmInstallWizard = ({
229
253
  initialInstallOptionsId,
230
254
  initialInstallOptionsData,
231
255
  initialChannelReleases,
232
- supportPortalLink
256
+ supportPortalLink,
257
+ isHelmAirgapEnabled = false
233
258
  }) => {
234
259
  const [step, setStep] = react.useState(initialStep ?? 1);
235
260
  const [instanceName, setInstanceName] = react.useState(initialInstallOptionsData?.instance_name ?? "");
@@ -263,7 +288,6 @@ var HelmInstallWizard = ({
263
288
  const [isLoadingInstructions, setIsLoadingInstructions] = react.useState(false);
264
289
  const [inputRegistryHostname, setInputRegistryHostname] = react.useState("");
265
290
  const [privateRegistryHostname, setPrivateRegistryHostname] = react.useState("");
266
- const registryDebounceRef = react.useRef(null);
267
291
  const [completedSteps, setCompletedSteps] = react.useState({});
268
292
  const hasInitializedFromProps = react.useRef(!!initialInstallOptionsData);
269
293
  react.useEffect(() => {
@@ -293,6 +317,7 @@ var HelmInstallWizard = ({
293
317
  }, [initialInstallOptionsData]);
294
318
  const hasLoadedReleases = react.useRef(!!initialChannelReleases?.length);
295
319
  const hasResumedInstallation = react.useRef(!!initialInstallOptionsData);
320
+ const selectedReleaseRef = react.useRef(selectedRelease);
296
321
  const helmReleases = react.useMemo(() => {
297
322
  return releases.filter((r) => r.helmCharts && r.helmCharts.length > 0);
298
323
  }, [releases]);
@@ -318,6 +343,9 @@ var HelmInstallWizard = ({
318
343
  prevInstallOptionsIdRef.current = installOptionsId;
319
344
  }
320
345
  }, [installOptionsId, onInstallOptionsIdChange]);
346
+ react.useEffect(() => {
347
+ selectedReleaseRef.current = selectedRelease;
348
+ }, [selectedRelease]);
321
349
  react.useEffect(() => {
322
350
  if (step !== 2 || !fetchChannelReleasesAction || hasLoadedReleases.current) {
323
351
  return;
@@ -394,37 +422,35 @@ var HelmInstallWizard = ({
394
422
  }
395
423
  };
396
424
  updateOptions();
397
- }, [selectedRelease, installOptionsId, token, updateInstallOptionsAction, networkAvailability, registryAccess, privateRegistryHostname]);
398
- const lastPrivateRegistryRef = react.useRef("");
425
+ }, [selectedRelease, installOptionsId, token, updateInstallOptionsAction, networkAvailability, registryAccess]);
399
426
  react.useEffect(() => {
400
- if (networkAvailability !== "airgap" || !installOptionsId || !getInstallOptionsAction) {
401
- return;
402
- }
403
- const currentValue = privateRegistryHostname || "";
404
- if (lastPrivateRegistryRef.current === currentValue) {
427
+ if (networkAvailability !== "airgap" || !installOptionsId || !updateInstallOptionsAction || !selectedRelease) {
405
428
  return;
406
429
  }
407
- lastPrivateRegistryRef.current = currentValue;
408
- const refreshInstructions = async () => {
409
- setIsLoadingInstructions(true);
430
+ const timeoutId = setTimeout(async () => {
431
+ const currentRelease = selectedReleaseRef.current;
432
+ if (!currentRelease) {
433
+ return;
434
+ }
410
435
  try {
411
- const result = await getInstallOptionsAction({
436
+ const result = await updateInstallOptionsAction({
412
437
  token,
413
438
  installOptionsId,
439
+ channelId: currentRelease.channelId,
440
+ channelReleaseSequence: currentRelease.channelSequence,
441
+ registryAvailability: registryAccess,
414
442
  includeInstructions: true,
415
- privateRegistryHostname: currentValue || void 0
443
+ privateRegistryHostname: privateRegistryHostname || void 0
416
444
  });
417
445
  if (result.instructions) {
418
446
  setInstructions(result.instructions);
419
447
  }
420
448
  } catch (error) {
421
- console.error("[helm-install-wizard] Failed to refresh instructions", error);
422
- } finally {
423
- setIsLoadingInstructions(false);
449
+ console.error("[helm-install-wizard] Failed to update private registry hostname", error);
424
450
  }
425
- };
426
- refreshInstructions();
427
- }, [privateRegistryHostname, networkAvailability, installOptionsId, token, getInstallOptionsAction]);
451
+ }, 500);
452
+ return () => clearTimeout(timeoutId);
453
+ }, [privateRegistryHostname, networkAvailability, installOptionsId, updateInstallOptionsAction, token, registryAccess]);
428
454
  react.useEffect(() => {
429
455
  if (hasResumedInstallation.current) {
430
456
  return;
@@ -527,7 +553,6 @@ var HelmInstallWizard = ({
527
553
  if (networkAvailability !== "airgap") {
528
554
  setInputRegistryHostname("");
529
555
  setPrivateRegistryHostname("");
530
- lastPrivateRegistryRef.current = "";
531
556
  }
532
557
  setInstructions(null);
533
558
  await updateInstallOptionsAction({
@@ -635,7 +660,7 @@ var HelmInstallWizard = ({
635
660
  onStepChange?.(1);
636
661
  };
637
662
  const handleFinish = react.useCallback(async () => {
638
- navigateTo("/update");
663
+ navigateTo("/updates/checking");
639
664
  }, []);
640
665
  const handleReleaseSelect = react.useCallback((release) => {
641
666
  setSelectedRelease(release);
@@ -643,30 +668,18 @@ var HelmInstallWizard = ({
643
668
  const handlePrivateRegistryHostnameChange = react.useCallback((e) => {
644
669
  const value = e.target.value;
645
670
  setInputRegistryHostname(value);
646
- if (registryDebounceRef.current) {
647
- clearTimeout(registryDebounceRef.current);
648
- }
649
- registryDebounceRef.current = setTimeout(() => {
650
- setPrivateRegistryHostname(value);
651
- }, 1e3);
652
- }, []);
653
- react.useEffect(() => {
654
- return () => {
655
- if (registryDebounceRef.current) {
656
- clearTimeout(registryDebounceRef.current);
657
- }
658
- };
671
+ setPrivateRegistryHostname(value);
659
672
  }, []);
660
673
  if (step === 2) {
661
674
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
662
- /* @__PURE__ */ jsxRuntime.jsx(StepIndicator, { step: 2 }),
675
+ /* @__PURE__ */ jsxRuntime.jsx(StepIndicator, { step: 2, primaryColor }),
663
676
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-2xl border border-gray-100 bg-gray-50 p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-6", children: [
664
677
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
665
678
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-semibold text-gray-900", children: networkAvailability === "proxy" ? "Helm Proxy Install" : networkAvailability === "airgap" ? "Helm Air Gap Install" : "Helm Online Install" }),
666
679
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 space-y-6", children: [
667
680
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
668
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
669
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "1" }),
681
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
682
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: "1" }),
670
683
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-gray-900", children: "Select a version" })
671
684
  ] }),
672
685
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -677,13 +690,14 @@ var HelmInstallWizard = ({
677
690
  onSelect: handleReleaseSelect,
678
691
  isLoading: isLoadingReleases,
679
692
  isLoadingInstructions,
680
- error: releasesError
693
+ error: releasesError,
694
+ primaryColor
681
695
  }
682
696
  )
683
697
  ] }),
684
698
  networkAvailability === "airgap" && selectedRelease && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
685
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
686
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "2" }),
699
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
700
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: "2" }),
687
701
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-gray-900", children: "(Optional) Specify registry URI" })
688
702
  ] }),
689
703
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-8", children: [
@@ -711,7 +725,8 @@ var HelmInstallWizard = ({
711
725
  isLoading: isLoadingInstructions,
712
726
  completedSteps,
713
727
  registryAccess,
714
- networkAvailability
728
+ networkAvailability,
729
+ primaryColor
715
730
  }
716
731
  )
717
732
  ] })
@@ -732,7 +747,8 @@ var HelmInstallWizard = ({
732
747
  {
733
748
  type: "button",
734
749
  onClick: handleFinish,
735
- className: "rounded-xl bg-indigo-500 px-4 py-2 font-medium text-white transition hover:bg-indigo-600",
750
+ className: "rounded-xl px-4 py-2 font-medium text-white transition-opacity duration-200 hover:opacity-90",
751
+ style: { backgroundColor: primaryColor },
736
752
  children: "Finish"
737
753
  }
738
754
  )
@@ -743,7 +759,8 @@ var HelmInstallWizard = ({
743
759
  /* @__PURE__ */ jsxRuntime.jsx(
744
760
  "a",
745
761
  {
746
- className: "text-indigo-500 hover:text-indigo-600",
762
+ className: "hover:opacity-80",
763
+ style: { color: secondaryColor },
747
764
  href: supportPortalLink,
748
765
  target: "_blank",
749
766
  rel: "noopener noreferrer",
@@ -755,7 +772,7 @@ var HelmInstallWizard = ({
755
772
  ] });
756
773
  }
757
774
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
758
- /* @__PURE__ */ jsxRuntime.jsx(StepIndicator, { step }),
775
+ /* @__PURE__ */ jsxRuntime.jsx(StepIndicator, { step, primaryColor }),
759
776
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-gray-100 bg-gray-50 p-6", children: [
760
777
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
761
778
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -823,7 +840,7 @@ var HelmInstallWizard = ({
823
840
  ),
824
841
  "Outbound requests require HTTPS Proxy"
825
842
  ] }),
826
- /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: true, children: [
843
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: !isHelmAirgapEnabled, children: [
827
844
  /* @__PURE__ */ jsxRuntime.jsx(
828
845
  "input",
829
846
  {
@@ -865,7 +882,7 @@ var HelmInstallWizard = ({
865
882
  ),
866
883
  "My workstation can only access the internet AND the registry (NOT the cluster)"
867
884
  ] }),
868
- /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: true, children: [
885
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: !isHelmAirgapEnabled, children: [
869
886
  /* @__PURE__ */ jsxRuntime.jsx(
870
887
  "input",
871
888
  {
@@ -888,7 +905,8 @@ var HelmInstallWizard = ({
888
905
  type: "button",
889
906
  onClick: handleContinue,
890
907
  disabled: isCreatingServiceAccount,
891
- className: "rounded-xl bg-indigo-500 px-4 py-2 font-medium text-white transition hover:bg-indigo-600 disabled:cursor-not-allowed disabled:opacity-50",
908
+ className: "rounded-xl px-4 py-2 font-medium text-white transition-opacity duration-200 hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",
909
+ style: { backgroundColor: primaryColor },
892
910
  children: isCreatingServiceAccount ? "Creating..." : "Continue"
893
911
  }
894
912
  )
@@ -921,8 +939,17 @@ async function handle401() {
921
939
  const { redirect } = await import('next/navigation');
922
940
  return redirect("/?expired=1");
923
941
  }
942
+ function isErrorPage(url) {
943
+ try {
944
+ const urlObj = new URL(url);
945
+ return urlObj.pathname === "/error";
946
+ } catch {
947
+ return url === "/error" || url.startsWith("/error?");
948
+ }
949
+ }
924
950
  async function handleServerError(statusCode) {
925
951
  const { redirect } = await import('next/navigation');
952
+ const { cookies } = await import('next/headers');
926
953
  let sourceUrl;
927
954
  try {
928
955
  const { headers } = await import('next/headers');
@@ -930,12 +957,20 @@ async function handleServerError(statusCode) {
930
957
  const referer = headersList.get("referer");
931
958
  const host = headersList.get("host");
932
959
  const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
933
- if (referer) {
960
+ if (referer && !isErrorPage(referer)) {
934
961
  sourceUrl = referer;
935
962
  } else if (host && pathname) {
936
963
  const protocol = headersList.get("x-forwarded-proto") || "https";
937
964
  sourceUrl = `${protocol}://${host}${pathname}`;
938
965
  }
966
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
967
+ const cookieStore = await cookies();
968
+ const preservedSource = cookieStore.get("portal_error_source");
969
+ if (preservedSource?.value) {
970
+ sourceUrl = decodeURIComponent(preservedSource.value);
971
+ cookieStore.delete("portal_error_source");
972
+ }
973
+ }
939
974
  } catch (error) {
940
975
  console.debug("[portal-components] Could not determine source URL", error);
941
976
  }
@@ -1015,11 +1050,15 @@ var fetchCustomBrandingImpl = async () => {
1015
1050
  const payload = await response.json();
1016
1051
  const brandingObject = {
1017
1052
  logo: payload.logoUrl,
1018
- title: payload.appName,
1019
- customColor1: payload.primaryColor,
1020
- customColor2: payload.secondaryColor,
1053
+ title: payload.title,
1054
+ primaryColor: payload.primaryColor,
1055
+ secondaryColor: payload.secondaryColor,
1021
1056
  favicon: payload.faviconUrl,
1022
- supportPortalLink: payload.supportPortalLink || ""
1057
+ supportPortalLink: payload.supportPortalLink || "",
1058
+ background: payload.background,
1059
+ backgroundImage: payload.backgroundImage,
1060
+ customColor1: payload.customColor1,
1061
+ customColor2: payload.customColor2
1023
1062
  };
1024
1063
  const brandingData = buffer.Buffer.from(JSON.stringify(brandingObject)).toString("base64");
1025
1064
  return {