@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/error.tsx","../../src/components/error-page.tsx"],"names":["jsx"],"mappings":"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","file":"error-page.js","sourcesContent":["\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg bg-indigo-600 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600\"\n >\n Go to Home\n </Link>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n","\"use client\";\n\nimport { Error } from \"./error\";\n\ninterface ErrorPageProps {\n statusCode?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n}\n\nexport const ErrorPage = ({ \n statusCode, \n message,\n homeUrl = \"/\",\n sourceUrl\n}: ErrorPageProps) => {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-gray-50 px-4 py-12\">\n <Error code={statusCode} message={message} homeUrl={homeUrl} sourceUrl={sourceUrl} />\n </div>\n );\n};\n\nErrorPage.displayName = \"ErrorPage\";\n"]}
1
+ {"version":3,"sources":["../../src/utils/constants.ts","../../src/components/error.tsx","../../src/components/error-page.tsx"],"names":["jsx"],"mappings":";;;;;;;;;;AAcO,IAAM,uBAAA,GAA0B,SAAA;ACRvC,IAAM,iBAAA,GAAoB,CAAC,KAAA,qBACzB,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,aAAA,EAAY,MAAA;AAAA,IACX,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,0FAAA,EAA2F,CAAA;AAAA,sBACnG,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,sBACrC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AAC3C,CAAA;AAGF,IAAM,UAAA,GAAa,CAAC,KAAA,qBAClB,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,aAAA,EAAY,MAAA;AAAA,IACX,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,sBACtD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,sBACvD,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,sBACrC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AACzC,CAAA;AAWF,IAAM,eAAA,GAAkB,CAAC,IAAA,KAAkB;AACzC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,qBAAA;AAAA,QACP,WAAA,EAAa,4EAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,qBAAA;AAAA,QACP,WAAA,EAAa,0EAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,iBAAA;AAAA,QACP,WAAA,EAAa,yDAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,uBAAA;AAAA,QACP,WAAA,EAAa,0DAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,gBAAA;AAAA,QACP,WAAA,EAAa,8DAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,oDAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,WAAA,EAAa,uDAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA;AAEN,CAAA;AAEO,IAAM,QAAQ,CAAC;AAAA,EACpB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,GAAA;AAAA,EACV,SAAA;AAAA,EACA;AACF,CAAA,KAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,MAAM,OAAO,YAAA,CAAa,IAAA;AAE1B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,EAAQ;AAAA,IACV,WAAW,SAAA,EAAW;AAGpB,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,MAAA,GAAS,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,mCAAA,CAAA;AAAA,MACxE,SAAS,CAAA,EAAG;AAAA,MAEZ;AACA,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,SAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,mBACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sGAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,4EAAA,EACb,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAuB,CAAA,EACzC,CAAA;AAAA,IAEC,IAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,MACjD;AAAA,KAAA,EACT,CAAA;AAAA,oBAGF,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EACX,uBAAa,KAAA,EAChB,CAAA;AAAA,wBAEC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EACV,QAAA,EAAA,OAAA,IAAW,aAAa,WAAA,EAC3B,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAU,uOAAA;AAAA,UACV,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,+BAAA,EAAkC,uBAAuB,CAAA,CAAA,CAAA,EAAI;AAAA,UACxF,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAAA,CACE,aAAa,OAAA,qBACb,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,oRAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ,CAAA;AAAA,IAEC,QAAQ,IAAA,IAAQ,GAAA,wBACd,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,mDAAA,EAE1C;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ,CAAA;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;AChKb,IAAM,YAAY,CAAC;AAAA,EACxB,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,GAAA;AAAA,EACV;AACF,CAAA,KAAsB;AACpB,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAM,UAAA,EAAY,OAAA,EAAkB,OAAA,EAAkB,WAAsB,CAAA,EACrF,CAAA;AAEJ;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"error-page.js","sourcesContent":["/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const 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\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n // Preserve source URL in a cookie so server-side can read it on retry\n // Cookie expires in 5 minutes (enough time for retry)\n try {\n document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;\n } catch (e) {\n // Ignore cookie errors\n }\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n style={{ backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` }}\n >\n Go to Home\n </Link>\n {(sourceUrl || onRetry) && (\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n )}\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n","\"use client\";\n\nimport { Error } from \"./error\";\n\ninterface ErrorPageProps {\n statusCode?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n}\n\nexport const ErrorPage = ({ \n statusCode, \n message,\n homeUrl = \"/\",\n sourceUrl\n}: ErrorPageProps) => {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-gray-50 px-4 py-12\">\n <Error code={statusCode} message={message} homeUrl={homeUrl} sourceUrl={sourceUrl} />\n </div>\n );\n};\n\nErrorPage.displayName = \"ErrorPage\";\n"]}
package/dist/esm/error.js CHANGED
@@ -7,6 +7,9 @@ import { jsx, jsxs } from 'react/jsx-runtime';
7
7
  * This file is generated by tsup. Do not edit manually.
8
8
  */
9
9
 
10
+
11
+ // src/utils/constants.ts
12
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
10
13
  var AlertTriangleIcon = (props) => /* @__PURE__ */ jsxs(
11
14
  "svg",
12
15
  {
@@ -101,6 +104,10 @@ var Error = ({
101
104
  if (onRetry) {
102
105
  onRetry();
103
106
  } else if (sourceUrl) {
107
+ try {
108
+ document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;
109
+ } catch (e) {
110
+ }
104
111
  window.location.href = sourceUrl;
105
112
  } else {
106
113
  window.location.reload();
@@ -119,11 +126,12 @@ var Error = ({
119
126
  Link,
120
127
  {
121
128
  href: homeUrl,
122
- className: "inline-flex items-center justify-center rounded-lg bg-indigo-600 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600",
129
+ className: "inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",
130
+ style: { backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` },
123
131
  children: "Go to Home"
124
132
  }
125
133
  ),
126
- /* @__PURE__ */ jsx(
134
+ (sourceUrl || onRetry) && /* @__PURE__ */ jsx(
127
135
  "button",
128
136
  {
129
137
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/error.tsx"],"names":[],"mappings":"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","file":"error.js","sourcesContent":["\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg bg-indigo-600 px-6 py-3 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600\"\n >\n Go to Home\n </Link>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n"]}
1
+ {"version":3,"sources":["../../src/utils/constants.ts","../../src/components/error.tsx"],"names":[],"mappings":"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","file":"error.js","sourcesContent":["/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const 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\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport type { SVGProps } from \"react\";\nimport Link from \"next/link\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\nconst AlertTriangleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nconst ServerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n);\n\nexport interface ErrorProps {\n code?: number;\n message?: string;\n homeUrl?: string;\n sourceUrl?: string;\n onRetry?: () => void;\n}\n\nconst getErrorContent = (code?: number) => {\n switch (code) {\n case 502:\n return {\n title: \"Service Unavailable\",\n description: \"The service is temporarily unavailable. Please try again in a few moments.\",\n icon: ServerIcon,\n };\n case 503:\n return {\n title: \"Service Unavailable\",\n description: \"The service is currently undergoing maintenance. Please try again later.\",\n icon: ServerIcon,\n };\n case 504:\n return {\n title: \"Gateway Timeout\",\n description: \"The request took too long to process. Please try again.\",\n icon: ServerIcon,\n };\n case 500:\n return {\n title: \"Internal Server Error\",\n description: \"Something went wrong on our end. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n case 404:\n return {\n title: \"Page Not Found\",\n description: \"The page you're looking for doesn't exist or has been moved.\",\n icon: AlertTriangleIcon,\n };\n case 403:\n return {\n title: \"Access Denied\",\n description: \"You don't have permission to access this resource.\",\n icon: AlertTriangleIcon,\n };\n default:\n return {\n title: \"Something Went Wrong\",\n description: \"An unexpected error occurred. Please try again later.\",\n icon: AlertTriangleIcon,\n };\n }\n};\n\nexport const Error = ({ \n code, \n message,\n homeUrl = \"/\",\n sourceUrl,\n onRetry\n}: ErrorProps) => {\n const errorContent = getErrorContent(code);\n const Icon = errorContent.icon;\n\n const handleRetry = () => {\n if (onRetry) {\n onRetry();\n } else if (sourceUrl) {\n // Preserve source URL in a cookie so server-side can read it on retry\n // Cookie expires in 5 minutes (enough time for retry)\n try {\n document.cookie = `portal_error_source=${encodeURIComponent(sourceUrl)}; path=/; max-age=300; samesite=lax`;\n } catch (e) {\n // Ignore cookie errors\n }\n window.location.href = sourceUrl;\n } else {\n window.location.reload();\n }\n };\n\n return (\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-3xl border border-gray-200 bg-white p-8 shadow-[0_12px_30px_rgba(17,24,39,0.12)] text-center\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-full bg-red-100\">\n <Icon className=\"h-8 w-8 text-red-600\" />\n </div>\n \n {code && (\n <div className=\"mt-6 text-sm font-semibold text-gray-500\">\n Error {code}\n </div>\n )}\n \n <h1 className=\"mt-2 text-2xl font-bold text-gray-900\">\n {errorContent.title}\n </h1>\n \n <p className=\"mt-4 text-sm text-gray-600\">\n {message || errorContent.description}\n </p>\n \n <div className=\"mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center\">\n <Link\n href={homeUrl}\n className=\"inline-flex items-center justify-center rounded-lg px-6 py-3 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n style={{ backgroundColor: `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` }}\n >\n Go to Home\n </Link>\n {(sourceUrl || onRetry) && (\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-6 py-3 text-sm font-semibold text-gray-700 shadow-sm transition hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600\"\n >\n Try Again\n </button>\n )}\n </div>\n \n {code && code >= 500 && (\n <p className=\"mt-6 text-xs text-gray-500\">\n If this problem persists, please contact support.\n </p>\n )}\n </div>\n </div>\n );\n};\n\nError.displayName = \"Error\";\n"]}
@@ -6,7 +6,40 @@ import { Buffer } from 'buffer';
6
6
  * Enterprise Portal Components
7
7
  * This file is generated by tsup. Do not edit manually.
8
8
  */
9
+ var __defProp = Object.defineProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+
15
+ // datadog/tracer.ts
16
+ var tracer_exports = {};
17
+ __export(tracer_exports, {
18
+ default: () => tracer_default
19
+ });
20
+ var tracer_default;
9
21
 
22
+ // src/utils/constants.ts
23
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
24
+ function useCopyToClipboard(resetDelay = 2e3) {
25
+ const [copied, setCopied] = useState(false);
26
+ const copy = useCallback(async (text) => {
27
+ if (!navigator.clipboard) {
28
+ console.warn("[useCopyToClipboard] Clipboard API not available");
29
+ return false;
30
+ }
31
+ try {
32
+ await navigator.clipboard.writeText(text);
33
+ setCopied(true);
34
+ setTimeout(() => setCopied(false), resetDelay);
35
+ return true;
36
+ } catch (error) {
37
+ console.error("[useCopyToClipboard] Failed to copy:", error);
38
+ return false;
39
+ }
40
+ }, [resetDelay]);
41
+ return { copy, copied };
42
+ }
10
43
  var navigateTo = (href) => {
11
44
  if (typeof window !== "undefined") {
12
45
  window.location.assign(href);
@@ -22,26 +55,12 @@ var K8S_DISTRIBUTIONS = [
22
55
  { value: "eks", label: "Amazon EKS" },
23
56
  { value: "gke", label: "Google GKE" }
24
57
  ];
25
- var copyToClipboard = async (text) => {
26
- try {
27
- await navigator.clipboard.writeText(text);
28
- return true;
29
- } catch {
30
- return false;
31
- }
32
- };
33
58
  var CodeBlock = ({
34
59
  command,
35
60
  className = ""
36
61
  }) => {
37
- const [copied, setCopied] = useState(false);
38
- const handleCopy = async () => {
39
- const success = await copyToClipboard(command);
40
- if (success) {
41
- setCopied(true);
42
- setTimeout(() => setCopied(false), 2e3);
43
- }
44
- };
62
+ const { copy, copied } = useCopyToClipboard();
63
+ const handleCopy = () => copy(command);
45
64
  return /* @__PURE__ */ jsxs("div", { className: `group relative min-w-0 ${className}`, children: [
46
65
  /* @__PURE__ */ jsx("pre", { className: "overflow-x-auto rounded-lg bg-gray-900 p-4 text-sm text-gray-100", children: /* @__PURE__ */ jsx("code", { className: "block", children: command }) }),
47
66
  /* @__PURE__ */ jsx(
@@ -56,11 +75,12 @@ var CodeBlock = ({
56
75
  )
57
76
  ] });
58
77
  };
59
- var StepIndicator = ({ step }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3", children: [
78
+ var StepIndicator = ({ step, primaryColor = DEFAULT_SECONDARY_COLOR }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3", children: [
60
79
  /* @__PURE__ */ jsx(
61
80
  "div",
62
81
  {
63
- 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"}`,
82
+ className: `flex h-10 w-10 items-center justify-center rounded-full border-2 ${step > 1 ? "border-gray-900 bg-gray-900 text-white" : ""}`,
83
+ style: step === 1 ? { borderColor: primaryColor } : void 0,
64
84
  children: step > 1 ? /* @__PURE__ */ jsx(
65
85
  "svg",
66
86
  {
@@ -72,7 +92,7 @@ var StepIndicator = ({ step }) => /* @__PURE__ */ jsxs("div", { className: "flex
72
92
  strokeWidth: "2",
73
93
  children: /* @__PURE__ */ jsx("path", { d: "m3.5 8 3 3 6-6" })
74
94
  }
75
- ) : /* @__PURE__ */ jsx("span", { className: "h-2.5 w-2.5 rounded-full bg-indigo-500" })
95
+ ) : /* @__PURE__ */ jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: { backgroundColor: primaryColor } })
76
96
  }
77
97
  ),
78
98
  /* @__PURE__ */ jsx("div", { className: `h-0.5 w-12 ${step > 1 ? "bg-gray-900" : "bg-gray-200"}` }),
@@ -90,11 +110,12 @@ var VersionDropdown = ({
90
110
  onSelect,
91
111
  isLoading,
92
112
  isLoadingInstructions,
93
- error
113
+ error,
114
+ primaryColor = DEFAULT_SECONDARY_COLOR
94
115
  }) => {
95
116
  if (isLoading) {
96
117
  return /* @__PURE__ */ jsxs("div", { className: "ml-8 flex items-center gap-2 text-sm text-gray-500", children: [
97
- /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
118
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
98
119
  "Loading versions..."
99
120
  ] });
100
121
  }
@@ -110,7 +131,7 @@ var VersionDropdown = ({
110
131
  return /* @__PURE__ */ jsxs("div", { className: "ml-8 space-y-2", children: [
111
132
  /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm text-gray-600", children: [
112
133
  "App Version",
113
- isLoadingInstructions && /* @__PURE__ */ jsx("span", { className: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" })
134
+ isLoadingInstructions && /* @__PURE__ */ jsx("span", { className: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } })
114
135
  ] }),
115
136
  /* @__PURE__ */ jsx(
116
137
  "select",
@@ -163,11 +184,12 @@ var InstallationInstructions = ({
163
184
  isLoading,
164
185
  completedSteps = {},
165
186
  registryAccess = "online",
166
- networkAvailability = "online"
187
+ networkAvailability = "online",
188
+ primaryColor = DEFAULT_SECONDARY_COLOR
167
189
  }) => {
168
190
  if (isLoading && !instructions?.steps?.length) {
169
191
  return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500", children: [
170
- /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-500" }),
192
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-gray-300", style: { borderTopColor: primaryColor } }),
171
193
  "Loading instructions..."
172
194
  ] }) });
173
195
  }
@@ -176,13 +198,13 @@ var InstallationInstructions = ({
176
198
  }
177
199
  const completableStepNames = ["export_credentials", "install_chart"];
178
200
  const stepOffset = networkAvailability === "airgap" ? 3 : 2;
179
- return /* @__PURE__ */ jsx("div", { className: `min-w-0 space-y-4 transition-opacity duration-150 ${isLoading ? "opacity-60" : ""}`, children: /* @__PURE__ */ jsx("ol", { className: "min-w-0 space-y-6 text-sm text-gray-700", children: instructions.steps.map((step, index) => {
201
+ return /* @__PURE__ */ jsx("div", { className: `min-w-0 space-y-4 transition-opacity duration-200 ${isLoading ? "opacity-60" : ""}`, children: /* @__PURE__ */ jsx("ol", { className: "min-w-0 space-y-6 text-sm text-gray-700", children: instructions.steps.map((step, index) => {
180
202
  const canComplete = step.maybe_completed || completableStepNames.includes(step.step_name);
181
203
  const isCompleted = canComplete && completedSteps[step.step_name];
182
204
  const isPartialInstallChart = registryAccess === "partial" && step.step_name === "install_chart";
183
205
  return /* @__PURE__ */ jsxs("li", { className: "space-y-2", children: [
184
206
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
185
- /* @__PURE__ */ 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 }),
207
+ /* @__PURE__ */ 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 }),
186
208
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: step.title }),
187
209
  canComplete && /* @__PURE__ */ jsx(
188
210
  "span",
@@ -216,6 +238,8 @@ var InstallationInstructions = ({
216
238
  };
217
239
  var HelmInstallWizard = ({
218
240
  token,
241
+ primaryColor = DEFAULT_SECONDARY_COLOR,
242
+ secondaryColor = DEFAULT_SECONDARY_COLOR,
219
243
  createServiceAccountAction,
220
244
  fetchChannelReleasesAction,
221
245
  createInstallOptionsAction,
@@ -227,7 +251,8 @@ var HelmInstallWizard = ({
227
251
  initialInstallOptionsId,
228
252
  initialInstallOptionsData,
229
253
  initialChannelReleases,
230
- supportPortalLink
254
+ supportPortalLink,
255
+ isHelmAirgapEnabled = false
231
256
  }) => {
232
257
  const [step, setStep] = useState(initialStep ?? 1);
233
258
  const [instanceName, setInstanceName] = useState(initialInstallOptionsData?.instance_name ?? "");
@@ -261,7 +286,6 @@ var HelmInstallWizard = ({
261
286
  const [isLoadingInstructions, setIsLoadingInstructions] = useState(false);
262
287
  const [inputRegistryHostname, setInputRegistryHostname] = useState("");
263
288
  const [privateRegistryHostname, setPrivateRegistryHostname] = useState("");
264
- const registryDebounceRef = useRef(null);
265
289
  const [completedSteps, setCompletedSteps] = useState({});
266
290
  const hasInitializedFromProps = useRef(!!initialInstallOptionsData);
267
291
  useEffect(() => {
@@ -291,6 +315,7 @@ var HelmInstallWizard = ({
291
315
  }, [initialInstallOptionsData]);
292
316
  const hasLoadedReleases = useRef(!!initialChannelReleases?.length);
293
317
  const hasResumedInstallation = useRef(!!initialInstallOptionsData);
318
+ const selectedReleaseRef = useRef(selectedRelease);
294
319
  const helmReleases = useMemo(() => {
295
320
  return releases.filter((r) => r.helmCharts && r.helmCharts.length > 0);
296
321
  }, [releases]);
@@ -316,6 +341,9 @@ var HelmInstallWizard = ({
316
341
  prevInstallOptionsIdRef.current = installOptionsId;
317
342
  }
318
343
  }, [installOptionsId, onInstallOptionsIdChange]);
344
+ useEffect(() => {
345
+ selectedReleaseRef.current = selectedRelease;
346
+ }, [selectedRelease]);
319
347
  useEffect(() => {
320
348
  if (step !== 2 || !fetchChannelReleasesAction || hasLoadedReleases.current) {
321
349
  return;
@@ -392,37 +420,35 @@ var HelmInstallWizard = ({
392
420
  }
393
421
  };
394
422
  updateOptions();
395
- }, [selectedRelease, installOptionsId, token, updateInstallOptionsAction, networkAvailability, registryAccess, privateRegistryHostname]);
396
- const lastPrivateRegistryRef = useRef("");
423
+ }, [selectedRelease, installOptionsId, token, updateInstallOptionsAction, networkAvailability, registryAccess]);
397
424
  useEffect(() => {
398
- if (networkAvailability !== "airgap" || !installOptionsId || !getInstallOptionsAction) {
399
- return;
400
- }
401
- const currentValue = privateRegistryHostname || "";
402
- if (lastPrivateRegistryRef.current === currentValue) {
425
+ if (networkAvailability !== "airgap" || !installOptionsId || !updateInstallOptionsAction || !selectedRelease) {
403
426
  return;
404
427
  }
405
- lastPrivateRegistryRef.current = currentValue;
406
- const refreshInstructions = async () => {
407
- setIsLoadingInstructions(true);
428
+ const timeoutId = setTimeout(async () => {
429
+ const currentRelease = selectedReleaseRef.current;
430
+ if (!currentRelease) {
431
+ return;
432
+ }
408
433
  try {
409
- const result = await getInstallOptionsAction({
434
+ const result = await updateInstallOptionsAction({
410
435
  token,
411
436
  installOptionsId,
437
+ channelId: currentRelease.channelId,
438
+ channelReleaseSequence: currentRelease.channelSequence,
439
+ registryAvailability: registryAccess,
412
440
  includeInstructions: true,
413
- privateRegistryHostname: currentValue || void 0
441
+ privateRegistryHostname: privateRegistryHostname || void 0
414
442
  });
415
443
  if (result.instructions) {
416
444
  setInstructions(result.instructions);
417
445
  }
418
446
  } catch (error) {
419
- console.error("[helm-install-wizard] Failed to refresh instructions", error);
420
- } finally {
421
- setIsLoadingInstructions(false);
447
+ console.error("[helm-install-wizard] Failed to update private registry hostname", error);
422
448
  }
423
- };
424
- refreshInstructions();
425
- }, [privateRegistryHostname, networkAvailability, installOptionsId, token, getInstallOptionsAction]);
449
+ }, 500);
450
+ return () => clearTimeout(timeoutId);
451
+ }, [privateRegistryHostname, networkAvailability, installOptionsId, updateInstallOptionsAction, token, registryAccess]);
426
452
  useEffect(() => {
427
453
  if (hasResumedInstallation.current) {
428
454
  return;
@@ -525,7 +551,6 @@ var HelmInstallWizard = ({
525
551
  if (networkAvailability !== "airgap") {
526
552
  setInputRegistryHostname("");
527
553
  setPrivateRegistryHostname("");
528
- lastPrivateRegistryRef.current = "";
529
554
  }
530
555
  setInstructions(null);
531
556
  await updateInstallOptionsAction({
@@ -633,7 +658,7 @@ var HelmInstallWizard = ({
633
658
  onStepChange?.(1);
634
659
  };
635
660
  const handleFinish = useCallback(async () => {
636
- navigateTo("/update");
661
+ navigateTo("/updates/checking");
637
662
  }, []);
638
663
  const handleReleaseSelect = useCallback((release) => {
639
664
  setSelectedRelease(release);
@@ -641,30 +666,18 @@ var HelmInstallWizard = ({
641
666
  const handlePrivateRegistryHostnameChange = useCallback((e) => {
642
667
  const value = e.target.value;
643
668
  setInputRegistryHostname(value);
644
- if (registryDebounceRef.current) {
645
- clearTimeout(registryDebounceRef.current);
646
- }
647
- registryDebounceRef.current = setTimeout(() => {
648
- setPrivateRegistryHostname(value);
649
- }, 1e3);
650
- }, []);
651
- useEffect(() => {
652
- return () => {
653
- if (registryDebounceRef.current) {
654
- clearTimeout(registryDebounceRef.current);
655
- }
656
- };
669
+ setPrivateRegistryHostname(value);
657
670
  }, []);
658
671
  if (step === 2) {
659
672
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
660
- /* @__PURE__ */ jsx(StepIndicator, { step: 2 }),
673
+ /* @__PURE__ */ jsx(StepIndicator, { step: 2, primaryColor }),
661
674
  /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-2xl border border-gray-100 bg-gray-50 p-6", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-6", children: [
662
675
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
663
676
  /* @__PURE__ */ 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" }),
664
677
  /* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-6", children: [
665
678
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
666
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
667
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "1" }),
679
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
680
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: "1" }),
668
681
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: "Select a version" })
669
682
  ] }),
670
683
  /* @__PURE__ */ jsx(
@@ -675,13 +688,14 @@ var HelmInstallWizard = ({
675
688
  onSelect: handleReleaseSelect,
676
689
  isLoading: isLoadingReleases,
677
690
  isLoadingInstructions,
678
- error: releasesError
691
+ error: releasesError,
692
+ primaryColor
679
693
  }
680
694
  )
681
695
  ] }),
682
696
  networkAvailability === "airgap" && selectedRelease && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
683
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-indigo-500", children: [
684
- /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 font-semibold", children: "2" }),
697
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", style: { color: primaryColor }, children: [
698
+ /* @__PURE__ */ jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full font-semibold", style: { backgroundColor: `${primaryColor}20`, color: primaryColor }, children: "2" }),
685
699
  /* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900", children: "(Optional) Specify registry URI" })
686
700
  ] }),
687
701
  /* @__PURE__ */ jsxs("div", { className: "ml-8", children: [
@@ -709,7 +723,8 @@ var HelmInstallWizard = ({
709
723
  isLoading: isLoadingInstructions,
710
724
  completedSteps,
711
725
  registryAccess,
712
- networkAvailability
726
+ networkAvailability,
727
+ primaryColor
713
728
  }
714
729
  )
715
730
  ] })
@@ -730,7 +745,8 @@ var HelmInstallWizard = ({
730
745
  {
731
746
  type: "button",
732
747
  onClick: handleFinish,
733
- className: "rounded-xl bg-indigo-500 px-4 py-2 font-medium text-white transition hover:bg-indigo-600",
748
+ className: "rounded-xl px-4 py-2 font-medium text-white transition-opacity duration-200 hover:opacity-90",
749
+ style: { backgroundColor: primaryColor },
734
750
  children: "Finish"
735
751
  }
736
752
  )
@@ -741,7 +757,8 @@ var HelmInstallWizard = ({
741
757
  /* @__PURE__ */ jsx(
742
758
  "a",
743
759
  {
744
- className: "text-indigo-500 hover:text-indigo-600",
760
+ className: "hover:opacity-80",
761
+ style: { color: secondaryColor },
745
762
  href: supportPortalLink,
746
763
  target: "_blank",
747
764
  rel: "noopener noreferrer",
@@ -753,7 +770,7 @@ var HelmInstallWizard = ({
753
770
  ] });
754
771
  }
755
772
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
756
- /* @__PURE__ */ jsx(StepIndicator, { step }),
773
+ /* @__PURE__ */ jsx(StepIndicator, { step, primaryColor }),
757
774
  /* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-gray-100 bg-gray-50 p-6", children: [
758
775
  /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
759
776
  /* @__PURE__ */ jsxs("div", { children: [
@@ -821,7 +838,7 @@ var HelmInstallWizard = ({
821
838
  ),
822
839
  "Outbound requests require HTTPS Proxy"
823
840
  ] }),
824
- /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: true, children: [
841
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: !isHelmAirgapEnabled, children: [
825
842
  /* @__PURE__ */ jsx(
826
843
  "input",
827
844
  {
@@ -863,7 +880,7 @@ var HelmInstallWizard = ({
863
880
  ),
864
881
  "My workstation can only access the internet AND the registry (NOT the cluster)"
865
882
  ] }),
866
- /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: true, children: [
883
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-3 text-sm text-gray-600", hidden: !isHelmAirgapEnabled, children: [
867
884
  /* @__PURE__ */ jsx(
868
885
  "input",
869
886
  {
@@ -886,7 +903,8 @@ var HelmInstallWizard = ({
886
903
  type: "button",
887
904
  onClick: handleContinue,
888
905
  disabled: isCreatingServiceAccount,
889
- 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",
906
+ 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",
907
+ style: { backgroundColor: primaryColor },
890
908
  children: isCreatingServiceAccount ? "Creating..." : "Continue"
891
909
  }
892
910
  )
@@ -919,8 +937,17 @@ async function handle401() {
919
937
  const { redirect } = await import('next/navigation');
920
938
  return redirect("/?expired=1");
921
939
  }
940
+ function isErrorPage(url) {
941
+ try {
942
+ const urlObj = new URL(url);
943
+ return urlObj.pathname === "/error";
944
+ } catch {
945
+ return url === "/error" || url.startsWith("/error?");
946
+ }
947
+ }
922
948
  async function handleServerError(statusCode) {
923
949
  const { redirect } = await import('next/navigation');
950
+ const { cookies } = await import('next/headers');
924
951
  let sourceUrl;
925
952
  try {
926
953
  const { headers } = await import('next/headers');
@@ -928,12 +955,20 @@ async function handleServerError(statusCode) {
928
955
  const referer = headersList.get("referer");
929
956
  const host = headersList.get("host");
930
957
  const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
931
- if (referer) {
958
+ if (referer && !isErrorPage(referer)) {
932
959
  sourceUrl = referer;
933
960
  } else if (host && pathname) {
934
961
  const protocol = headersList.get("x-forwarded-proto") || "https";
935
962
  sourceUrl = `${protocol}://${host}${pathname}`;
936
963
  }
964
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
965
+ const cookieStore = await cookies();
966
+ const preservedSource = cookieStore.get("portal_error_source");
967
+ if (preservedSource?.value) {
968
+ sourceUrl = decodeURIComponent(preservedSource.value);
969
+ cookieStore.delete("portal_error_source");
970
+ }
971
+ }
937
972
  } catch (error) {
938
973
  console.debug("[portal-components] Could not determine source URL", error);
939
974
  }
@@ -1013,11 +1048,15 @@ var fetchCustomBrandingImpl = async () => {
1013
1048
  const payload = await response.json();
1014
1049
  const brandingObject = {
1015
1050
  logo: payload.logoUrl,
1016
- title: payload.appName,
1017
- customColor1: payload.primaryColor,
1018
- customColor2: payload.secondaryColor,
1051
+ title: payload.title,
1052
+ primaryColor: payload.primaryColor,
1053
+ secondaryColor: payload.secondaryColor,
1019
1054
  favicon: payload.faviconUrl,
1020
- supportPortalLink: payload.supportPortalLink || ""
1055
+ supportPortalLink: payload.supportPortalLink || "",
1056
+ background: payload.background,
1057
+ backgroundImage: payload.backgroundImage,
1058
+ customColor1: payload.customColor1,
1059
+ customColor2: payload.customColor2
1021
1060
  };
1022
1061
  const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
1023
1062
  return {