@replicated/portal-components 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/change-team.js +39 -0
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +1 -1
  6. package/dist/actions/index.d.ts +1 -1
  7. package/dist/actions/index.js +40 -0
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +1 -1
  10. package/dist/actions/install-actions.d.ts +1 -1
  11. package/dist/actions/install-actions.js +39 -0
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +1 -1
  14. package/dist/actions/service-account.d.ts +1 -1
  15. package/dist/actions/service-account.js +39 -0
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +1 -1
  18. package/dist/actions/support-bundles.d.ts +1 -1
  19. package/dist/actions/support-bundles.js +39 -0
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +1 -1
  22. package/dist/actions/team-settings.d.ts +1 -1
  23. package/dist/actions/team-settings.js +39 -0
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.js +39 -0
  26. package/dist/actions/trial-signup.js.map +1 -1
  27. package/dist/actions/user-settings.d.mts +1 -1
  28. package/dist/actions/user-settings.d.ts +1 -1
  29. package/dist/actions/user-settings.js +39 -0
  30. package/dist/actions/user-settings.js.map +1 -1
  31. package/dist/airgap-instances.d.mts +1 -1
  32. package/dist/airgap-instances.d.ts +1 -1
  33. package/dist/airgap-instances.js +3 -2
  34. package/dist/airgap-instances.js.map +1 -1
  35. package/dist/esm/actions/change-team.js +39 -0
  36. package/dist/esm/actions/change-team.js.map +1 -1
  37. package/dist/esm/actions/index.js +40 -1
  38. package/dist/esm/actions/index.js.map +1 -1
  39. package/dist/esm/actions/install-actions.js +39 -0
  40. package/dist/esm/actions/install-actions.js.map +1 -1
  41. package/dist/esm/actions/service-account.js +39 -0
  42. package/dist/esm/actions/service-account.js.map +1 -1
  43. package/dist/esm/actions/support-bundles.js +39 -0
  44. package/dist/esm/actions/support-bundles.js.map +1 -1
  45. package/dist/esm/actions/team-settings.js +39 -0
  46. package/dist/esm/actions/team-settings.js.map +1 -1
  47. package/dist/esm/actions/trial-signup.js +39 -0
  48. package/dist/esm/actions/trial-signup.js.map +1 -1
  49. package/dist/esm/actions/user-settings.js +39 -0
  50. package/dist/esm/actions/user-settings.js.map +1 -1
  51. package/dist/esm/airgap-instances.js +3 -2
  52. package/dist/esm/airgap-instances.js.map +1 -1
  53. package/dist/esm/helm-install-wizard.js +414 -189
  54. package/dist/esm/helm-install-wizard.js.map +1 -1
  55. package/dist/esm/index.js +89 -64
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/install-actions.js +39 -0
  58. package/dist/esm/install-actions.js.map +1 -1
  59. package/dist/esm/instance-card.js +2 -1
  60. package/dist/esm/instance-card.js.map +1 -1
  61. package/dist/esm/license-details.js +39 -0
  62. package/dist/esm/license-details.js.map +1 -1
  63. package/dist/esm/linux-install-wizard.js +310 -166
  64. package/dist/esm/linux-install-wizard.js.map +1 -1
  65. package/dist/esm/logout-action.js +187 -0
  66. package/dist/esm/logout-action.js.map +1 -0
  67. package/dist/esm/logout-button.js +32 -0
  68. package/dist/esm/logout-button.js.map +1 -0
  69. package/dist/esm/markdown-renderer.js +16 -0
  70. package/dist/esm/markdown-renderer.js.map +1 -0
  71. package/dist/esm/middleware.js +3 -3
  72. package/dist/esm/middleware.js.map +1 -1
  73. package/dist/esm/online-instance-list.js +3 -2
  74. package/dist/esm/online-instance-list.js.map +1 -1
  75. package/dist/esm/saml-callback-client.js +5 -2
  76. package/dist/esm/saml-callback-client.js.map +1 -1
  77. package/dist/esm/saml-handlers.js +104 -0
  78. package/dist/esm/saml-handlers.js.map +1 -1
  79. package/dist/esm/support-bundle-collection-card.js +3 -2
  80. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  81. package/dist/esm/support-bundles-card.js +2 -2
  82. package/dist/esm/support-bundles-card.js.map +1 -1
  83. package/dist/esm/support-card.js +39 -0
  84. package/dist/esm/support-card.js.map +1 -1
  85. package/dist/esm/top-nav-menu-close.js +46 -0
  86. package/dist/esm/top-nav-menu-close.js.map +1 -0
  87. package/dist/esm/top-nav.js +149 -59
  88. package/dist/esm/top-nav.js.map +1 -1
  89. package/dist/esm/trial-signup.js +6 -3
  90. package/dist/esm/trial-signup.js.map +1 -1
  91. package/dist/esm/update-layout.js +149 -59
  92. package/dist/esm/update-layout.js.map +1 -1
  93. package/dist/esm/upload-support-bundle-modal.js +2 -2
  94. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  95. package/dist/esm/user-menu-dropdown.js +52 -0
  96. package/dist/esm/user-menu-dropdown.js.map +1 -0
  97. package/dist/esm/user-settings.js +5 -5
  98. package/dist/esm/user-settings.js.map +1 -1
  99. package/dist/esm/utils/index.js +39 -0
  100. package/dist/esm/utils/index.js.map +1 -1
  101. package/dist/helm-install-wizard.d.mts +18 -7
  102. package/dist/helm-install-wizard.d.ts +18 -7
  103. package/dist/helm-install-wizard.js +418 -189
  104. package/dist/helm-install-wizard.js.map +1 -1
  105. package/dist/{index-sMbq94M7.d.ts → index-DXy7RxOX.d.ts} +18 -1
  106. package/dist/{index-DyzJ0yKD.d.mts → index-JX9-CIMA.d.mts} +18 -1
  107. package/dist/index.d.mts +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +89 -64
  110. package/dist/index.js.map +1 -1
  111. package/dist/install-actions.d.mts +2 -2
  112. package/dist/install-actions.d.ts +2 -2
  113. package/dist/install-actions.js +39 -0
  114. package/dist/install-actions.js.map +1 -1
  115. package/dist/instance-card.d.mts +1 -1
  116. package/dist/instance-card.d.ts +1 -1
  117. package/dist/instance-card.js +2 -1
  118. package/dist/instance-card.js.map +1 -1
  119. package/dist/license-details.js +39 -0
  120. package/dist/license-details.js.map +1 -1
  121. package/dist/linux-install-wizard.d.mts +17 -7
  122. package/dist/linux-install-wizard.d.ts +17 -7
  123. package/dist/linux-install-wizard.js +314 -166
  124. package/dist/linux-install-wizard.js.map +1 -1
  125. package/dist/logout-action.d.mts +7 -0
  126. package/dist/logout-action.d.ts +7 -0
  127. package/dist/logout-action.js +189 -0
  128. package/dist/logout-action.js.map +1 -0
  129. package/dist/logout-button.d.mts +16 -0
  130. package/dist/logout-button.d.ts +16 -0
  131. package/dist/logout-button.js +34 -0
  132. package/dist/logout-button.js.map +1 -0
  133. package/dist/markdown-renderer.d.mts +12 -0
  134. package/dist/markdown-renderer.d.ts +12 -0
  135. package/dist/markdown-renderer.js +22 -0
  136. package/dist/markdown-renderer.js.map +1 -0
  137. package/dist/middleware.js +3 -3
  138. package/dist/middleware.js.map +1 -1
  139. package/dist/online-instance-list.d.mts +1 -1
  140. package/dist/online-instance-list.d.ts +1 -1
  141. package/dist/online-instance-list.js +3 -2
  142. package/dist/online-instance-list.js.map +1 -1
  143. package/dist/pending-installations.d.mts +1 -1
  144. package/dist/pending-installations.d.ts +1 -1
  145. package/dist/saml-callback-client.js +5 -2
  146. package/dist/saml-callback-client.js.map +1 -1
  147. package/dist/saml-handlers.js +104 -0
  148. package/dist/saml-handlers.js.map +1 -1
  149. package/dist/security-card.d.mts +1 -1
  150. package/dist/security-card.d.ts +1 -1
  151. package/dist/styles.css +39 -0
  152. package/dist/support-bundle-collection-card.js +3 -2
  153. package/dist/support-bundle-collection-card.js.map +1 -1
  154. package/dist/support-bundles-card.d.mts +2 -2
  155. package/dist/support-bundles-card.d.ts +2 -2
  156. package/dist/support-bundles-card.js +2 -2
  157. package/dist/support-bundles-card.js.map +1 -1
  158. package/dist/support-card.js +39 -0
  159. package/dist/support-card.js.map +1 -1
  160. package/dist/top-nav-menu-close.d.mts +10 -0
  161. package/dist/top-nav-menu-close.d.ts +10 -0
  162. package/dist/top-nav-menu-close.js +48 -0
  163. package/dist/top-nav-menu-close.js.map +1 -0
  164. package/dist/top-nav.js +149 -59
  165. package/dist/top-nav.js.map +1 -1
  166. package/dist/trial-signup.js +6 -3
  167. package/dist/trial-signup.js.map +1 -1
  168. package/dist/update-layout.js +149 -59
  169. package/dist/update-layout.js.map +1 -1
  170. package/dist/upload-support-bundle-modal.js +2 -2
  171. package/dist/upload-support-bundle-modal.js.map +1 -1
  172. package/dist/user-menu-dropdown.d.mts +25 -0
  173. package/dist/user-menu-dropdown.d.ts +25 -0
  174. package/dist/user-menu-dropdown.js +59 -0
  175. package/dist/user-menu-dropdown.js.map +1 -0
  176. package/dist/user-settings.js +5 -5
  177. package/dist/user-settings.js.map +1 -1
  178. package/dist/utils/index.d.mts +1 -1
  179. package/dist/utils/index.d.ts +1 -1
  180. package/dist/utils/index.js +39 -0
  181. package/dist/utils/index.js.map +1 -1
  182. package/package.json +29 -2
@@ -10,6 +10,9 @@ var jsxRuntime = require('react/jsx-runtime');
10
10
  * This file is generated by tsup. Do not edit manually.
11
11
  */
12
12
 
13
+
14
+ // src/utils/constants.ts
15
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
13
16
  function TrialSignup({
14
17
  appSlug,
15
18
  branding,
@@ -29,8 +32,8 @@ function TrialSignup({
29
32
  const [error, setError] = react.useState("");
30
33
  const [isPending, startTransition] = react.useTransition();
31
34
  const router = navigation.useRouter();
32
- const primaryColor = branding?.primaryColor || "#6366f1";
33
- const secondaryColor = branding?.secondaryColor || "#6366f1";
35
+ const primaryColor = branding?.primaryColor || DEFAULT_SECONDARY_COLOR;
36
+ const secondaryColor = branding?.secondaryColor || DEFAULT_SECONDARY_COLOR;
34
37
  const handleSubmit = async (e) => {
35
38
  e.preventDefault();
36
39
  setError("");
@@ -81,7 +84,7 @@ function TrialSignup({
81
84
  className: "max-w-[360px] max-h-[48px]"
82
85
  }
83
86
  ) }),
84
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-center mb-2", children: branding?.title || defaultTitle }),
87
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-center mb-2 text-gray-900", children: branding?.title || defaultTitle }),
85
88
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-center text-gray-600 mb-6", children: licenseType === "community" ? "Get your community license" : `Start your ${trialExpirationDays} day trial` }),
86
89
  !isCodeSent && /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "w-full", children: [
87
90
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/trial-signup.tsx"],"names":["useState","useTransition","useRouter","jsxs","jsx","Fragment"],"mappings":"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","file":"trial-signup.js","sourcesContent":["\"use client\";\n\nimport { useState, useTransition, FormEvent } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\nexport interface TrialSignupProps {\n appSlug: string;\n branding: {\n logo?: string;\n title?: string;\n primaryColor?: string;\n secondaryColor?: string;\n } | null;\n trialExpirationDays: number;\n licenseType: string;\n termsAndConditionsUrl: string;\n defaultTitle?: string;\n createTrialSignup: (payload: {\n appSlug: string;\n company: string;\n email: string;\n }) => Promise<{ success: boolean; error?: string }>;\n verifyTrialSignup: (code: string) => Promise<{\n success: boolean;\n error?: string;\n redirectUrl?: string;\n }>;\n}\n\nexport function TrialSignup({\n appSlug,\n branding,\n trialExpirationDays,\n licenseType,\n termsAndConditionsUrl,\n defaultTitle = \"Enterprise Portal\",\n createTrialSignup,\n verifyTrialSignup,\n}: TrialSignupProps) {\n const [companyName, setCompanyName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [isCodeSent, setIsCodeSent] = useState(false);\n const [validationCode, setValidationCode] = useState(\"\");\n const [termsAccepted, setTermsAccepted] = useState(false);\n const [showTermsError, setShowTermsError] = useState(false);\n const [error, setError] = useState(\"\");\n const [isPending, startTransition] = useTransition();\n const router = useRouter();\n\n const primaryColor = branding?.primaryColor || \"#6366f1\";\n const secondaryColor = branding?.secondaryColor || \"#6366f1\";\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n setShowTermsError(false);\n\n // Validate terms acceptance if required\n if (termsAndConditionsUrl && !termsAccepted) {\n setShowTermsError(true);\n return;\n }\n\n startTransition(async () => {\n const result = await createTrialSignup({\n appSlug,\n company: companyName,\n email,\n });\n\n if (result.success) {\n setIsCodeSent(true);\n } else {\n setError(result.error || \"An error occurred. Please try again.\");\n }\n });\n };\n\n const handleValidateCode = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n\n startTransition(async () => {\n const result = await verifyTrialSignup(validationCode);\n\n if (result.success && result.redirectUrl) {\n // Redirect to dashboard\n router.push(result.redirectUrl);\n router.refresh();\n } else {\n setError(result.error || \"Verification failed. Please try again.\");\n }\n });\n };\n\n const handleUseDifferentEmail = () => {\n setIsCodeSent(false);\n setCompanyName(\"\");\n setEmail(\"\");\n setValidationCode(\"\");\n setError(\"\");\n };\n\n return (\n <div className=\"w-[480px] rounded-lg border-2 border-solid p-8\" style={{ borderColor: secondaryColor, minHeight: branding?.logo ? \"342px\" : \"242px\" }}>\n {/* Logo */}\n {branding?.logo && (\n <div className=\"flex justify-center mb-4\">\n <img\n src={branding.logo}\n alt={branding?.title || \"Logo\"}\n className=\"max-w-[360px] max-h-[48px]\"\n />\n </div>\n )}\n\n {/* Title */}\n <h1 className=\"text-2xl font-bold text-center mb-2\">\n {branding?.title || defaultTitle}\n </h1>\n\n {/* Subtitle */}\n <p className=\"text-center text-gray-600 mb-6\">\n {licenseType === \"community\"\n ? \"Get your community license\"\n : `Start your ${trialExpirationDays} day trial`}\n </p>\n\n {/* Step 1: Company and Email Form */}\n {!isCodeSent && (\n <form onSubmit={handleSubmit} className=\"w-full\">\n {/* Company Name */}\n <div className=\"mb-4\">\n <label htmlFor=\"company-name\" className=\"block mb-2 text-gray-600\">\n Company name\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\" />\n </svg>\n <input\n id=\"company-name\"\n type=\"text\"\n placeholder=\"Your company\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Email */}\n <div className=\"mb-4\">\n <label htmlFor=\"email\" className=\"block mb-2 text-gray-600\">\n Work email address\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n <input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@company.com\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Terms and Conditions */}\n {termsAndConditionsUrl && (\n <div className=\"mb-4\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n id=\"terms-checkbox\"\n checked={termsAccepted}\n onChange={(e) => {\n setTermsAccepted(e.target.checked);\n if (e.target.checked) {\n setShowTermsError(false);\n }\n }}\n className=\"mt-1 min-w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n required\n disabled={isPending}\n />\n <label htmlFor=\"terms-checkbox\" className=\"text-sm text-gray-600 leading-relaxed\">\n I agree to the{\" \"}\n <a\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:underline font-medium\"\n style={{ color: primaryColor }}\n >\n Terms and Conditions\n </a>\n </label>\n </div>\n </div>\n )}\n\n {/* Terms Error */}\n {showTermsError && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n Please accept the Terms and Conditions to continue.\n </div>\n )}\n\n {/* API Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n className=\"w-full flex justify-center items-center bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={\n !companyName.trim() ||\n !email.trim() ||\n isPending ||\n (!!termsAndConditionsUrl && !termsAccepted)\n }\n >\n {isPending ? (\n \"Creating account...\"\n ) : (\n <>\n Create account\n <svg className=\"ml-2 h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </>\n )}\n </button>\n\n {/* Login Link */}\n <a\n href=\"/login\"\n className=\"hover:underline font-semibold mt-4 text-center cursor-pointer block\"\n style={{ color: secondaryColor }}\n >\n Already have an account? Sign in\n </a>\n </form>\n )}\n\n {/* Step 2: Verification Code Form */}\n {isCodeSent && (\n <form onSubmit={handleValidateCode} className=\"w-full\">\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label htmlFor=\"code\" className=\"block text-sm font-medium text-gray-700\">\n Verification code\n </label>\n <button\n type=\"button\"\n onClick={handleUseDifferentEmail}\n className=\"text-sm text-blue-600 hover:text-blue-700 hover:underline\"\n style={{ color: primaryColor }}\n >\n Use different email\n </button>\n </div>\n <div className=\"mt-1\">\n <input\n id=\"code\"\n name=\"code\"\n type=\"text\"\n value={validationCode}\n onChange={(e) => setValidationCode(e.target.value)}\n className=\"portal-input w-full\"\n placeholder=\"Enter 12-digit code\"\n required\n disabled={isPending}\n />\n </div>\n <p className=\"mt-2 text-sm text-gray-600 mb-4 text-pretty\">\n A verification code has been sent to {email}. Please check your inbox.\n </p>\n </div>\n\n {/* Verification Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Verify Button */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={!validationCode.trim() || isPending}\n >\n {isPending\n ? \"Verifying...\"\n : licenseType === \"community\"\n ? \"Verify code and get license\"\n : \"Verify code and start trial\"}\n </button>\n </form>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/constants.ts","../src/components/trial-signup.tsx"],"names":["useState","useTransition","useRouter","jsxs","jsx","Fragment"],"mappings":"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","file":"trial-signup.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 { useState, useTransition, FormEvent } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\nexport interface TrialSignupProps {\n appSlug: string;\n branding: {\n logo?: string;\n title?: string;\n primaryColor?: string;\n secondaryColor?: string;\n } | null;\n trialExpirationDays: number;\n licenseType: string;\n termsAndConditionsUrl: string;\n defaultTitle?: string;\n createTrialSignup: (payload: {\n appSlug: string;\n company: string;\n email: string;\n }) => Promise<{ success: boolean; error?: string }>;\n verifyTrialSignup: (code: string) => Promise<{\n success: boolean;\n error?: string;\n redirectUrl?: string;\n }>;\n}\n\nexport function TrialSignup({\n appSlug,\n branding,\n trialExpirationDays,\n licenseType,\n termsAndConditionsUrl,\n defaultTitle = \"Enterprise Portal\",\n createTrialSignup,\n verifyTrialSignup,\n}: TrialSignupProps) {\n const [companyName, setCompanyName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [isCodeSent, setIsCodeSent] = useState(false);\n const [validationCode, setValidationCode] = useState(\"\");\n const [termsAccepted, setTermsAccepted] = useState(false);\n const [showTermsError, setShowTermsError] = useState(false);\n const [error, setError] = useState(\"\");\n const [isPending, startTransition] = useTransition();\n const router = useRouter();\n\n const primaryColor = branding?.primaryColor || DEFAULT_SECONDARY_COLOR;\n const secondaryColor = branding?.secondaryColor || DEFAULT_SECONDARY_COLOR;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n setShowTermsError(false);\n\n // Validate terms acceptance if required\n if (termsAndConditionsUrl && !termsAccepted) {\n setShowTermsError(true);\n return;\n }\n\n startTransition(async () => {\n const result = await createTrialSignup({\n appSlug,\n company: companyName,\n email,\n });\n\n if (result.success) {\n setIsCodeSent(true);\n } else {\n setError(result.error || \"An error occurred. Please try again.\");\n }\n });\n };\n\n const handleValidateCode = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n\n startTransition(async () => {\n const result = await verifyTrialSignup(validationCode);\n\n if (result.success && result.redirectUrl) {\n // Redirect to dashboard\n router.push(result.redirectUrl);\n router.refresh();\n } else {\n setError(result.error || \"Verification failed. Please try again.\");\n }\n });\n };\n\n const handleUseDifferentEmail = () => {\n setIsCodeSent(false);\n setCompanyName(\"\");\n setEmail(\"\");\n setValidationCode(\"\");\n setError(\"\");\n };\n\n return (\n <div className=\"w-[480px] rounded-lg border-2 border-solid p-8\" style={{ borderColor: secondaryColor, minHeight: branding?.logo ? \"342px\" : \"242px\" }}>\n {/* Logo */}\n {branding?.logo && (\n <div className=\"flex justify-center mb-4\">\n <img\n src={branding.logo}\n alt={branding?.title || \"Logo\"}\n className=\"max-w-[360px] max-h-[48px]\"\n />\n </div>\n )}\n\n {/* Title */}\n <h1 className=\"text-2xl font-bold text-center mb-2 text-gray-900\">\n {branding?.title || defaultTitle}\n </h1>\n\n {/* Subtitle */}\n <p className=\"text-center text-gray-600 mb-6\">\n {licenseType === \"community\"\n ? \"Get your community license\"\n : `Start your ${trialExpirationDays} day trial`}\n </p>\n\n {/* Step 1: Company and Email Form */}\n {!isCodeSent && (\n <form onSubmit={handleSubmit} className=\"w-full\">\n {/* Company Name */}\n <div className=\"mb-4\">\n <label htmlFor=\"company-name\" className=\"block mb-2 text-gray-600\">\n Company name\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\" />\n </svg>\n <input\n id=\"company-name\"\n type=\"text\"\n placeholder=\"Your company\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Email */}\n <div className=\"mb-4\">\n <label htmlFor=\"email\" className=\"block mb-2 text-gray-600\">\n Work email address\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n <input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@company.com\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Terms and Conditions */}\n {termsAndConditionsUrl && (\n <div className=\"mb-4\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n id=\"terms-checkbox\"\n checked={termsAccepted}\n onChange={(e) => {\n setTermsAccepted(e.target.checked);\n if (e.target.checked) {\n setShowTermsError(false);\n }\n }}\n className=\"mt-1 min-w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n required\n disabled={isPending}\n />\n <label htmlFor=\"terms-checkbox\" className=\"text-sm text-gray-600 leading-relaxed\">\n I agree to the{\" \"}\n <a\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:underline font-medium\"\n style={{ color: primaryColor }}\n >\n Terms and Conditions\n </a>\n </label>\n </div>\n </div>\n )}\n\n {/* Terms Error */}\n {showTermsError && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n Please accept the Terms and Conditions to continue.\n </div>\n )}\n\n {/* API Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n className=\"w-full flex justify-center items-center bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={\n !companyName.trim() ||\n !email.trim() ||\n isPending ||\n (!!termsAndConditionsUrl && !termsAccepted)\n }\n >\n {isPending ? (\n \"Creating account...\"\n ) : (\n <>\n Create account\n <svg className=\"ml-2 h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </>\n )}\n </button>\n\n {/* Login Link */}\n <a\n href=\"/login\"\n className=\"hover:underline font-semibold mt-4 text-center cursor-pointer block\"\n style={{ color: secondaryColor }}\n >\n Already have an account? Sign in\n </a>\n </form>\n )}\n\n {/* Step 2: Verification Code Form */}\n {isCodeSent && (\n <form onSubmit={handleValidateCode} className=\"w-full\">\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label htmlFor=\"code\" className=\"block text-sm font-medium text-gray-700\">\n Verification code\n </label>\n <button\n type=\"button\"\n onClick={handleUseDifferentEmail}\n className=\"text-sm text-blue-600 hover:text-blue-700 hover:underline\"\n style={{ color: primaryColor }}\n >\n Use different email\n </button>\n </div>\n <div className=\"mt-1\">\n <input\n id=\"code\"\n name=\"code\"\n type=\"text\"\n value={validationCode}\n onChange={(e) => setValidationCode(e.target.value)}\n className=\"portal-input w-full\"\n placeholder=\"Enter 12-digit code\"\n required\n disabled={isPending}\n />\n </div>\n <p className=\"mt-2 text-sm text-gray-600 mb-4 text-pretty\">\n A verification code has been sent to {email}. Please check your inbox.\n </p>\n </div>\n\n {/* Verification Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Verify Button */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={!validationCode.trim() || isPending}\n >\n {isPending\n ? \"Verifying...\"\n : licenseType === \"community\"\n ? \"Verify code and get license\"\n : \"Verify code and start trial\"}\n </button>\n </form>\n )}\n </div>\n );\n}\n"]}
@@ -3,6 +3,7 @@
3
3
  var Link = require('next/link');
4
4
  var buffer = require('buffer');
5
5
  var react = require('react');
6
+ var lucideReact = require('lucide-react');
6
7
  var jsxRuntime = require('react/jsx-runtime');
7
8
 
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -26,6 +27,71 @@ __export(tracer_exports, {
26
27
  });
27
28
  var tracer_default;
28
29
 
30
+ // src/utils/api-client.ts
31
+ async function authenticatedFetch(url, options = {}) {
32
+ const { token, ...fetchOptions } = options;
33
+ const headers = new Headers(fetchOptions.headers);
34
+ if (token) {
35
+ headers.set("authorization", `Bearer ${token}`);
36
+ }
37
+ const response = await fetch(url, {
38
+ ...fetchOptions,
39
+ headers
40
+ });
41
+ if (response.status === 401) {
42
+ await handle401();
43
+ }
44
+ if (response.status === 502 || response.status === 503 || response.status === 504) {
45
+ await handleServerError(response.status);
46
+ }
47
+ return response;
48
+ }
49
+ async function handle401() {
50
+ const { redirect } = await import('next/navigation');
51
+ return redirect("/?expired=1");
52
+ }
53
+ function isErrorPage(url) {
54
+ try {
55
+ const urlObj = new URL(url);
56
+ return urlObj.pathname === "/error";
57
+ } catch {
58
+ return url === "/error" || url.startsWith("/error?");
59
+ }
60
+ }
61
+ async function handleServerError(statusCode) {
62
+ const { redirect } = await import('next/navigation');
63
+ const { cookies } = await import('next/headers');
64
+ let sourceUrl;
65
+ try {
66
+ const { headers } = await import('next/headers');
67
+ const headersList = await headers();
68
+ const referer = headersList.get("referer");
69
+ const host = headersList.get("host");
70
+ const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
71
+ if (referer && !isErrorPage(referer)) {
72
+ sourceUrl = referer;
73
+ } else if (host && pathname) {
74
+ const protocol = headersList.get("x-forwarded-proto") || "https";
75
+ sourceUrl = `${protocol}://${host}${pathname}`;
76
+ }
77
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
78
+ const cookieStore = await cookies();
79
+ const preservedSource = cookieStore.get("portal_error_source");
80
+ if (preservedSource?.value) {
81
+ sourceUrl = decodeURIComponent(preservedSource.value);
82
+ cookieStore.delete("portal_error_source");
83
+ }
84
+ }
85
+ } catch (error) {
86
+ console.debug("[portal-components] Could not determine source URL", error);
87
+ }
88
+ const params = new URLSearchParams({ code: String(statusCode) });
89
+ if (sourceUrl) {
90
+ params.set("source", sourceUrl);
91
+ }
92
+ return redirect(`/error?${params.toString()}`);
93
+ }
94
+
29
95
  // src/utils/constants.ts
30
96
  var DEFAULT_PRIMARY_COLOR = "#4f46e5";
31
97
  var DEFAULT_SECONDARY_COLOR = "#6366f1";
@@ -154,6 +220,84 @@ var fetchCustomBrandingImpl = async () => {
154
220
  };
155
221
  };
156
222
  var fetchCustomBranding = react.cache(fetchCustomBrandingImpl);
223
+ var fetchDocumentationImpl = async () => {
224
+ const { cookies } = await import('next/headers');
225
+ const sessionStore = await cookies();
226
+ const session = sessionStore.get("portal_session");
227
+ const token = session?.value;
228
+ if (!token) {
229
+ throw new Error("Authentication required");
230
+ }
231
+ const url = `${getApiOrigin()}/enterprise-portal/documentation`;
232
+ if (process.env.NODE_ENV !== "production") {
233
+ console.debug(
234
+ "[portal-components] fetching documentation via %s (Enterprise Portal API)",
235
+ url
236
+ );
237
+ }
238
+ const response = await authenticatedFetch(url, {
239
+ method: "GET",
240
+ token,
241
+ headers: {
242
+ accept: "application/json"
243
+ }
244
+ });
245
+ if (!response.ok) {
246
+ throw new Error(
247
+ `Documentation request failed (${response.status} ${response.statusText})`
248
+ );
249
+ }
250
+ const data = await response.json();
251
+ return {
252
+ helmPreInstall: data.helmPreInstall || "",
253
+ helmPostInstall: data.helmPostInstall || "",
254
+ embeddedClusterPreInstall: data.embeddedClusterPreInstall || "",
255
+ embeddedClusterPostInstall: data.embeddedClusterPostInstall || "",
256
+ helmInstallUrl: data.helmInstallUrl || "",
257
+ embeddedClusterInstallUrl: data.embeddedClusterInstallUrl || "",
258
+ valuesOverrideUrl: data.valuesOverrideUrl || ""
259
+ };
260
+ };
261
+ react.cache(fetchDocumentationImpl);
262
+ function UserMenuDropdown({
263
+ displayLabel,
264
+ children,
265
+ className = ""
266
+ }) {
267
+ return /* @__PURE__ */ jsxRuntime.jsxs("details", { className: `group relative ${className}`, children: [
268
+ /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors list-none border border-transparent hover:border-gray-200", children: [
269
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "h-4 w-4" }),
270
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: displayLabel }),
271
+ /* @__PURE__ */ jsxRuntime.jsx(
272
+ "svg",
273
+ {
274
+ xmlns: "http://www.w3.org/2000/svg",
275
+ width: "16",
276
+ height: "16",
277
+ viewBox: "0 0 24 24",
278
+ fill: "none",
279
+ stroke: "currentColor",
280
+ strokeWidth: "2",
281
+ strokeLinecap: "round",
282
+ strokeLinejoin: "round",
283
+ className: "h-4 w-4 text-gray-500 transition-transform group-open:rotate-180",
284
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
285
+ }
286
+ )
287
+ ] }),
288
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-0 mt-2 w-52 rounded-lg border border-gray-200 bg-white py-1.5 shadow-xl z-50", children })
289
+ ] });
290
+ }
291
+ function UserMenuItem({ href, children }) {
292
+ return /* @__PURE__ */ jsxRuntime.jsx(
293
+ Link__default.default,
294
+ {
295
+ href,
296
+ className: "block w-full px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 transition-colors",
297
+ children
298
+ }
299
+ );
300
+ }
157
301
  var defaultTopNavLinks = [
158
302
  {
159
303
  label: "Dashboard",
@@ -450,65 +594,11 @@ var TopNav = async ({
450
594
  ),
451
595
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl font-bold text-gray-900", children: brandTitle || "Enterprise Portal" })
452
596
  ] }),
453
- /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "group relative", children: [
454
- /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 list-none", children: [
455
- /* @__PURE__ */ jsxRuntime.jsxs(
456
- "svg",
457
- {
458
- xmlns: "http://www.w3.org/2000/svg",
459
- width: "16",
460
- height: "16",
461
- viewBox: "0 0 24 24",
462
- fill: "none",
463
- stroke: "currentColor",
464
- strokeWidth: "2",
465
- strokeLinecap: "round",
466
- strokeLinejoin: "round",
467
- className: "text-gray-500",
468
- children: [
469
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" }),
470
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "7", r: "4" })
471
- ]
472
- }
473
- ),
474
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: displayLabel }),
475
- /* @__PURE__ */ jsxRuntime.jsx(
476
- "svg",
477
- {
478
- xmlns: "http://www.w3.org/2000/svg",
479
- width: "16",
480
- height: "16",
481
- viewBox: "0 0 24 24",
482
- fill: "none",
483
- stroke: "currentColor",
484
- strokeWidth: "2",
485
- strokeLinecap: "round",
486
- strokeLinejoin: "round",
487
- className: "text-gray-500",
488
- children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
489
- }
490
- )
491
- ] }),
492
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-0 mt-2 w-48 rounded-md border border-gray-200 bg-white py-2 text-sm text-gray-700 shadow-lg z-50", children: [
493
- /* @__PURE__ */ jsxRuntime.jsx(
494
- Link__default.default,
495
- {
496
- href: "/user-settings",
497
- className: "block w-full px-4 py-2 text-left hover:bg-gray-100",
498
- children: "User settings"
499
- }
500
- ),
501
- /* @__PURE__ */ jsxRuntime.jsx(
502
- Link__default.default,
503
- {
504
- href: "/team-settings",
505
- className: "block w-full px-4 py-2 text-left hover:bg-gray-100",
506
- children: "Team settings"
507
- }
508
- ),
509
- userMenuChildren,
510
- logoutButton
511
- ] })
597
+ /* @__PURE__ */ jsxRuntime.jsxs(UserMenuDropdown, { displayLabel, children: [
598
+ /* @__PURE__ */ jsxRuntime.jsx(UserMenuItem, { href: "/user-settings", children: "User settings" }),
599
+ /* @__PURE__ */ jsxRuntime.jsx(UserMenuItem, { href: "/team-settings", children: "Team settings" }),
600
+ userMenuChildren,
601
+ logoutButton
512
602
  ] })
513
603
  ] }),
514
604
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex flex-wrap gap-3 pb-2 text-sm font-medium text-gray-500", children: resolvedLinks.map(({ label, icon, href }) => {