@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
@@ -0,0 +1,256 @@
1
+ "use client";
2
+ import { useState, useTransition } from 'react';
3
+ import { useRouter } from 'next/navigation';
4
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ /**
7
+ * Enterprise Portal Components
8
+ * This file is generated by tsup. Do not edit manually.
9
+ */
10
+
11
+ function TrialSignup({
12
+ appSlug,
13
+ branding,
14
+ trialExpirationDays,
15
+ licenseType,
16
+ termsAndConditionsUrl,
17
+ defaultTitle = "Enterprise Portal",
18
+ createTrialSignup,
19
+ verifyTrialSignup
20
+ }) {
21
+ const [companyName, setCompanyName] = useState("");
22
+ const [email, setEmail] = useState("");
23
+ const [isCodeSent, setIsCodeSent] = useState(false);
24
+ const [validationCode, setValidationCode] = useState("");
25
+ const [termsAccepted, setTermsAccepted] = useState(false);
26
+ const [showTermsError, setShowTermsError] = useState(false);
27
+ const [error, setError] = useState("");
28
+ const [isPending, startTransition] = useTransition();
29
+ const router = useRouter();
30
+ const primaryColor = branding?.primaryColor || "#6366f1";
31
+ const secondaryColor = branding?.secondaryColor || "#6366f1";
32
+ const handleSubmit = async (e) => {
33
+ e.preventDefault();
34
+ setError("");
35
+ setShowTermsError(false);
36
+ if (termsAndConditionsUrl && !termsAccepted) {
37
+ setShowTermsError(true);
38
+ return;
39
+ }
40
+ startTransition(async () => {
41
+ const result = await createTrialSignup({
42
+ appSlug,
43
+ company: companyName,
44
+ email
45
+ });
46
+ if (result.success) {
47
+ setIsCodeSent(true);
48
+ } else {
49
+ setError(result.error || "An error occurred. Please try again.");
50
+ }
51
+ });
52
+ };
53
+ const handleValidateCode = async (e) => {
54
+ e.preventDefault();
55
+ setError("");
56
+ startTransition(async () => {
57
+ const result = await verifyTrialSignup(validationCode);
58
+ if (result.success && result.redirectUrl) {
59
+ router.push(result.redirectUrl);
60
+ router.refresh();
61
+ } else {
62
+ setError(result.error || "Verification failed. Please try again.");
63
+ }
64
+ });
65
+ };
66
+ const handleUseDifferentEmail = () => {
67
+ setIsCodeSent(false);
68
+ setCompanyName("");
69
+ setEmail("");
70
+ setValidationCode("");
71
+ setError("");
72
+ };
73
+ return /* @__PURE__ */ jsxs("div", { className: "w-[480px] rounded-lg border-2 border-solid p-8", style: { borderColor: secondaryColor, minHeight: branding?.logo ? "342px" : "242px" }, children: [
74
+ branding?.logo && /* @__PURE__ */ jsx("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ jsx(
75
+ "img",
76
+ {
77
+ src: branding.logo,
78
+ alt: branding?.title || "Logo",
79
+ className: "max-w-[360px] max-h-[48px]"
80
+ }
81
+ ) }),
82
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-center mb-2", children: branding?.title || defaultTitle }),
83
+ /* @__PURE__ */ jsx("p", { className: "text-center text-gray-600 mb-6", children: licenseType === "community" ? "Get your community license" : `Start your ${trialExpirationDays} day trial` }),
84
+ !isCodeSent && /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "w-full", children: [
85
+ /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
86
+ /* @__PURE__ */ jsx("label", { htmlFor: "company-name", className: "block mb-2 text-gray-600", children: "Company name" }),
87
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
88
+ /* @__PURE__ */ jsx(
89
+ "svg",
90
+ {
91
+ className: "absolute w-5 h-5 text-gray-400 pointer-events-none",
92
+ style: { left: "12px", top: "50%", transform: "translateY(-50%)" },
93
+ fill: "none",
94
+ stroke: "currentColor",
95
+ viewBox: "0 0 24 24",
96
+ children: /* @__PURE__ */ jsx("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" })
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(
100
+ "input",
101
+ {
102
+ id: "company-name",
103
+ type: "text",
104
+ placeholder: "Your company",
105
+ className: "portal-input w-full py-2.5",
106
+ style: { paddingLeft: "44px" },
107
+ value: companyName,
108
+ onChange: (e) => setCompanyName(e.target.value),
109
+ required: true,
110
+ disabled: isPending
111
+ }
112
+ )
113
+ ] })
114
+ ] }),
115
+ /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
116
+ /* @__PURE__ */ jsx("label", { htmlFor: "email", className: "block mb-2 text-gray-600", children: "Work email address" }),
117
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
118
+ /* @__PURE__ */ jsx(
119
+ "svg",
120
+ {
121
+ className: "absolute w-5 h-5 text-gray-400 pointer-events-none",
122
+ style: { left: "12px", top: "50%", transform: "translateY(-50%)" },
123
+ fill: "none",
124
+ stroke: "currentColor",
125
+ viewBox: "0 0 24 24",
126
+ children: /* @__PURE__ */ jsx("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" })
127
+ }
128
+ ),
129
+ /* @__PURE__ */ jsx(
130
+ "input",
131
+ {
132
+ id: "email",
133
+ type: "email",
134
+ placeholder: "you@company.com",
135
+ className: "portal-input w-full py-2.5",
136
+ style: { paddingLeft: "44px" },
137
+ value: email,
138
+ onChange: (e) => setEmail(e.target.value),
139
+ required: true,
140
+ disabled: isPending
141
+ }
142
+ )
143
+ ] })
144
+ ] }),
145
+ termsAndConditionsUrl && /* @__PURE__ */ jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
146
+ /* @__PURE__ */ jsx(
147
+ "input",
148
+ {
149
+ type: "checkbox",
150
+ id: "terms-checkbox",
151
+ checked: termsAccepted,
152
+ onChange: (e) => {
153
+ setTermsAccepted(e.target.checked);
154
+ if (e.target.checked) {
155
+ setShowTermsError(false);
156
+ }
157
+ },
158
+ className: "mt-1 min-w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500",
159
+ required: true,
160
+ disabled: isPending
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsxs("label", { htmlFor: "terms-checkbox", className: "text-sm text-gray-600 leading-relaxed", children: [
164
+ "I agree to the",
165
+ " ",
166
+ /* @__PURE__ */ jsx(
167
+ "a",
168
+ {
169
+ href: termsAndConditionsUrl,
170
+ target: "_blank",
171
+ rel: "noopener noreferrer",
172
+ className: "text-blue-600 hover:underline font-medium",
173
+ style: { color: primaryColor },
174
+ children: "Terms and Conditions"
175
+ }
176
+ )
177
+ ] })
178
+ ] }) }),
179
+ showTermsError && /* @__PURE__ */ jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: "Please accept the Terms and Conditions to continue." }),
180
+ error && /* @__PURE__ */ jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: error }),
181
+ /* @__PURE__ */ jsx(
182
+ "button",
183
+ {
184
+ type: "submit",
185
+ 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",
186
+ style: { background: primaryColor, borderColor: primaryColor },
187
+ disabled: !companyName.trim() || !email.trim() || isPending || !!termsAndConditionsUrl && !termsAccepted,
188
+ children: isPending ? "Creating account..." : /* @__PURE__ */ jsxs(Fragment, { children: [
189
+ "Create account",
190
+ /* @__PURE__ */ jsx("svg", { className: "ml-2 h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M14 5l7 7m0 0l-7 7m7-7H3" }) })
191
+ ] })
192
+ }
193
+ ),
194
+ /* @__PURE__ */ jsx(
195
+ "a",
196
+ {
197
+ href: "/login",
198
+ className: "hover:underline font-semibold mt-4 text-center cursor-pointer block",
199
+ style: { color: secondaryColor },
200
+ children: "Already have an account? Sign in"
201
+ }
202
+ )
203
+ ] }),
204
+ isCodeSent && /* @__PURE__ */ jsxs("form", { onSubmit: handleValidateCode, className: "w-full", children: [
205
+ /* @__PURE__ */ jsxs("div", { children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1", children: [
207
+ /* @__PURE__ */ jsx("label", { htmlFor: "code", className: "block text-sm font-medium text-gray-700", children: "Verification code" }),
208
+ /* @__PURE__ */ jsx(
209
+ "button",
210
+ {
211
+ type: "button",
212
+ onClick: handleUseDifferentEmail,
213
+ className: "text-sm text-blue-600 hover:text-blue-700 hover:underline",
214
+ style: { color: primaryColor },
215
+ children: "Use different email"
216
+ }
217
+ )
218
+ ] }),
219
+ /* @__PURE__ */ jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsx(
220
+ "input",
221
+ {
222
+ id: "code",
223
+ name: "code",
224
+ type: "text",
225
+ value: validationCode,
226
+ onChange: (e) => setValidationCode(e.target.value),
227
+ className: "portal-input w-full",
228
+ placeholder: "Enter 12-digit code",
229
+ required: true,
230
+ disabled: isPending
231
+ }
232
+ ) }),
233
+ /* @__PURE__ */ jsxs("p", { className: "mt-2 text-sm text-gray-600 mb-4 text-pretty", children: [
234
+ "A verification code has been sent to ",
235
+ email,
236
+ ". Please check your inbox."
237
+ ] })
238
+ ] }),
239
+ error && /* @__PURE__ */ jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: error }),
240
+ /* @__PURE__ */ jsx(
241
+ "button",
242
+ {
243
+ type: "submit",
244
+ 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",
245
+ style: { background: primaryColor, borderColor: primaryColor },
246
+ disabled: !validationCode.trim() || isPending,
247
+ children: isPending ? "Verifying..." : licenseType === "community" ? "Verify code and get license" : "Verify code and start trial"
248
+ }
249
+ )
250
+ ] })
251
+ ] });
252
+ }
253
+
254
+ export { TrialSignup };
255
+ //# sourceMappingURL=trial-signup.js.map
256
+ //# sourceMappingURL=trial-signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/trial-signup.tsx"],"names":[],"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,5 +1,5 @@
1
- import { Buffer } from 'buffer';
2
1
  import Link from 'next/link';
2
+ import { Buffer } from 'buffer';
3
3
  import { cache } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -7,7 +7,97 @@ import { jsxs, jsx } from 'react/jsx-runtime';
7
7
  * Enterprise Portal Components
8
8
  * This file is generated by tsup. Do not edit manually.
9
9
  */
10
+ var __defProp = Object.defineProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+
16
+ // datadog/tracer.ts
17
+ var tracer_exports = {};
18
+ __export(tracer_exports, {
19
+ default: () => tracer_default
20
+ });
21
+ var tracer_default;
10
22
 
23
+ // src/utils/constants.ts
24
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
25
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
26
+
27
+ // src/utils/branding.ts
28
+ var normalizeColor = (color) => {
29
+ if (!color || typeof color !== "string") {
30
+ return void 0;
31
+ }
32
+ const trimmed = color.trim();
33
+ if (/^#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(trimmed)) {
34
+ return trimmed.startsWith("#") ? trimmed : `#${trimmed}`;
35
+ }
36
+ console.debug("[portal-components] Invalid color format rejected (only hex supported):", trimmed);
37
+ return void 0;
38
+ };
39
+ var sanitizeUrlForCss = (url) => {
40
+ if (!url || typeof url !== "string") {
41
+ return void 0;
42
+ }
43
+ const trimmed = url.trim();
44
+ try {
45
+ const urlObj = new URL(trimmed);
46
+ if (!["http:", "https:", "data:"].includes(urlObj.protocol)) {
47
+ console.debug("[portal-components] Invalid URL protocol for background image:", urlObj.protocol);
48
+ return void 0;
49
+ }
50
+ } catch {
51
+ console.debug("[portal-components] Invalid URL format for background image:", trimmed);
52
+ return void 0;
53
+ }
54
+ const escaped = trimmed.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/"/g, '\\"').replace(/'/g, "\\'").replace(/[\x00-\x1F\x7F]/g, "");
55
+ return escaped;
56
+ };
57
+ var decodeBranding = ({ brandingData }) => {
58
+ if (!brandingData || typeof brandingData !== "string") {
59
+ return {
60
+ primaryColor: DEFAULT_PRIMARY_COLOR,
61
+ secondaryColor: DEFAULT_SECONDARY_COLOR
62
+ };
63
+ }
64
+ try {
65
+ const decoded = Buffer.from(brandingData, "base64").toString("utf-8");
66
+ const parsed = JSON.parse(decoded);
67
+ const logo = typeof parsed.logo === "string" ? parsed.logo : void 0;
68
+ const titleRaw = typeof parsed.title === "string" ? parsed.title.trim() : "";
69
+ const title = titleRaw ? titleRaw : void 0;
70
+ const favicon = typeof parsed.favicon === "string" ? parsed.favicon : void 0;
71
+ const primaryColorRaw = parsed.primaryColor ?? parsed.primary_color;
72
+ const secondaryColorRaw = parsed.secondaryColor ?? parsed.secondary_color;
73
+ const primaryColor = normalizeColor(primaryColorRaw);
74
+ const secondaryColor = normalizeColor(secondaryColorRaw);
75
+ const supportPortalLink = typeof parsed.supportPortalLink === "string" ? parsed.supportPortalLink : void 0;
76
+ const backgroundRaw = parsed.background;
77
+ const background = backgroundRaw === "minimal" || backgroundRaw === "custom" || backgroundRaw === "image" ? backgroundRaw : void 0;
78
+ const backgroundImage = sanitizeUrlForCss(parsed.backgroundImage);
79
+ const backgroundGradientStart = normalizeColor(parsed.customColor1);
80
+ const backgroundGradientEnd = normalizeColor(parsed.customColor2);
81
+ return {
82
+ logo,
83
+ title,
84
+ favicon,
85
+ primaryColor: primaryColor || DEFAULT_PRIMARY_COLOR,
86
+ secondaryColor: secondaryColor || DEFAULT_SECONDARY_COLOR,
87
+ supportPortalLink,
88
+ background,
89
+ backgroundImage,
90
+ backgroundGradientStart,
91
+ backgroundGradientEnd
92
+ };
93
+ } catch (error) {
94
+ console.debug("[portal-components] unable to parse branding JSON", error);
95
+ return {
96
+ primaryColor: DEFAULT_PRIMARY_COLOR,
97
+ secondaryColor: DEFAULT_SECONDARY_COLOR
98
+ };
99
+ }
100
+ };
11
101
 
12
102
  // src/actions/index.ts
13
103
  var getApiOrigin = () => {
@@ -40,11 +130,15 @@ var fetchCustomBrandingImpl = async () => {
40
130
  const payload = await response.json();
41
131
  const brandingObject = {
42
132
  logo: payload.logoUrl,
43
- title: payload.appName,
44
- customColor1: payload.primaryColor,
45
- customColor2: payload.secondaryColor,
133
+ title: payload.title,
134
+ primaryColor: payload.primaryColor,
135
+ secondaryColor: payload.secondaryColor,
46
136
  favicon: payload.faviconUrl,
47
- supportPortalLink: payload.supportPortalLink || ""
137
+ supportPortalLink: payload.supportPortalLink || "",
138
+ background: payload.background,
139
+ backgroundImage: payload.backgroundImage,
140
+ customColor1: payload.customColor1,
141
+ customColor2: payload.customColor2
48
142
  };
49
143
  const brandingData = Buffer.from(JSON.stringify(brandingObject)).toString("base64");
50
144
  return {
@@ -239,57 +333,49 @@ var TopNav = async ({
239
333
  currentCustomerId,
240
334
  onChangeTeam,
241
335
  userMenuChildren,
242
- logoutButton
336
+ logoutButton,
337
+ branding: brandingProp
243
338
  }) => {
244
339
  const displayLabel = userMenuLabel || (customerName ? `Team: ${customerName}` : "Team: Example");
245
340
  let logo;
246
341
  let brandTitle;
247
- let customColor1;
248
- let customColor2;
249
- const normalizeColor = (color) => {
250
- if (!color || typeof color !== "string") {
251
- return void 0;
252
- }
253
- const trimmed = color.trim();
254
- if (/^#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(trimmed)) {
255
- return trimmed.startsWith("#") ? trimmed : `#${trimmed}`;
342
+ let primaryColor;
343
+ let secondaryColor;
344
+ let background;
345
+ let backgroundImageUrl;
346
+ let backgroundGradientStart;
347
+ let backgroundGradientEnd;
348
+ if (brandingProp) {
349
+ if (brandingProp.logo && typeof brandingProp.logo === "string") {
350
+ logo = brandingProp.logo;
256
351
  }
257
- return trimmed;
258
- };
259
- try {
260
- const branding = await fetchCustomBranding();
261
- if (branding.brandingData) {
262
- const decoded = Buffer.from(branding.brandingData, "base64").toString(
263
- "utf-8"
264
- );
265
- try {
266
- const parsed = JSON.parse(decoded);
267
- if (parsed?.logo && typeof parsed.logo === "string") {
268
- logo = parsed.logo;
269
- }
270
- if (parsed?.title && typeof parsed.title === "string") {
271
- const normalizedTitle = parsed.title.trim();
272
- if (normalizedTitle) {
273
- brandTitle = normalizedTitle;
274
- }
275
- }
276
- if (parsed?.customColor1 && typeof parsed.customColor1 === "string") {
277
- customColor1 = normalizeColor(parsed.customColor1);
278
- }
279
- if (parsed?.customColor2 && typeof parsed.customColor2 === "string") {
280
- customColor2 = normalizeColor(parsed.customColor2);
281
- }
282
- } catch (error) {
283
- console.debug(
284
- "[portal-components] unable to parse branding JSON",
285
- error
286
- );
352
+ if (brandingProp.title && typeof brandingProp.title === "string") {
353
+ const normalizedTitle = brandingProp.title.trim();
354
+ if (normalizedTitle) {
355
+ brandTitle = normalizedTitle;
287
356
  }
288
- } else {
289
- console.debug("[portal-components] branding", branding);
290
357
  }
291
- } catch (error) {
292
- console.debug("[portal-components] branding fetch failed", error);
358
+ primaryColor = normalizeColor(brandingProp.primaryColor);
359
+ secondaryColor = normalizeColor(brandingProp.secondaryColor);
360
+ background = brandingProp.background;
361
+ backgroundImageUrl = brandingProp.backgroundImage;
362
+ backgroundGradientStart = normalizeColor(brandingProp.backgroundGradientStart);
363
+ backgroundGradientEnd = normalizeColor(brandingProp.backgroundGradientEnd);
364
+ } else {
365
+ try {
366
+ const brandingResponse = await fetchCustomBranding();
367
+ const branding = decodeBranding({ brandingData: brandingResponse.brandingData });
368
+ logo = branding.logo;
369
+ brandTitle = branding.title;
370
+ primaryColor = branding.primaryColor;
371
+ secondaryColor = branding.secondaryColor;
372
+ background = branding.background;
373
+ backgroundImageUrl = branding.backgroundImage;
374
+ backgroundGradientStart = branding.backgroundGradientStart;
375
+ backgroundGradientEnd = branding.backgroundGradientEnd;
376
+ } catch (error) {
377
+ console.debug("[portal-components] branding fetch failed", error);
378
+ }
293
379
  }
294
380
  const baseLinks = links ?? defaultTopNavLinks;
295
381
  const hiddenSet = hiddenLabels ? new Set(hiddenLabels) : null;
@@ -300,20 +386,32 @@ var TopNav = async ({
300
386
  resolvedLinks = [...resolvedLinks, ...additionalLinks];
301
387
  }
302
388
  resolvedLinks = orderLinks(resolvedLinks, order);
303
- const gradientStart = customColor1 ?? "rgb(235, 102, 88)";
304
- const gradientEnd = customColor2 ?? customColor1 ?? "rgb(184, 83, 71)";
389
+ const getHeaderBackgroundStyle = () => {
390
+ if (background === "image" && backgroundImageUrl) {
391
+ return {
392
+ background: `url(${backgroundImageUrl})`,
393
+ backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.3) 30%, rgba(255, 255, 255, 0)), url(${backgroundImageUrl})`,
394
+ backgroundSize: "cover",
395
+ backgroundPosition: "center",
396
+ backgroundRepeat: "no-repeat"
397
+ };
398
+ }
399
+ const gradientStart = background === "custom" && backgroundGradientStart ? backgroundGradientStart : primaryColor;
400
+ const gradientEnd = background === "custom" && backgroundGradientEnd ? backgroundGradientEnd : secondaryColor;
401
+ return {
402
+ backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0) 33%), linear-gradient(${gradientStart}, ${gradientEnd})`,
403
+ backgroundRepeat: "no-repeat",
404
+ backgroundSize: "100% 100%"
405
+ };
406
+ };
305
407
  return /* @__PURE__ */ jsx(
306
408
  "div",
307
409
  {
308
410
  className: "relative flex h-[280px] w-full items-start justify-center",
309
- style: {
310
- backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0) 33%), linear-gradient(${gradientStart}, ${gradientEnd})`,
311
- backgroundRepeat: "no-repeat",
312
- backgroundSize: "100% 100%"
313
- },
314
- children: /* @__PURE__ */ jsx("div", { className: "mx-auto mt-[30px] w-full max-w-[1248px] px-6", children: /* @__PURE__ */ jsxs("div", { className: "flex h-[135px] flex-col justify-between space-y-4 rounded bg-[#ffffffe6] px-6 pt-6 pb-4 shadow-[0_10px_60px_rgba(16,16,16,0.35)]", children: [
411
+ style: getHeaderBackgroundStyle(),
412
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto mt-[30px] w-full max-w-[1248px] px-6", children: /* @__PURE__ */ jsxs("div", { className: "flex h-[142px] flex-col justify-between space-y-4 rounded bg-[#ffffffe6] px-6 pt-6 pb-4 shadow-[0_10px_60px_rgba(16,16,16,0.35)]", children: [
315
413
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
316
- logo || brandTitle ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
414
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
317
415
  logo ? (
318
416
  // eslint-disable-next-line @next/next/no-img-element
319
417
  /* @__PURE__ */ jsx(
@@ -328,9 +426,24 @@ var TopNav = async ({
328
426
  }
329
427
  }
330
428
  )
331
- ) : null,
332
- brandTitle ? /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-gray-900", children: brandTitle }) : null
333
- ] }) : /* @__PURE__ */ jsx("div", {}),
429
+ ) : /* @__PURE__ */ jsxs(
430
+ "svg",
431
+ {
432
+ className: "h-8 w-8 text-gray-400",
433
+ viewBox: "0 0 24 24",
434
+ fill: "none",
435
+ stroke: "currentColor",
436
+ strokeWidth: "1.5",
437
+ "aria-hidden": "true",
438
+ children: [
439
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
440
+ /* @__PURE__ */ jsx("ellipse", { cx: "12", cy: "12", rx: "4", ry: "10" }),
441
+ /* @__PURE__ */ jsx("path", { d: "M2 12h20" })
442
+ ]
443
+ }
444
+ ),
445
+ /* @__PURE__ */ jsx("span", { className: "text-xl font-bold text-gray-900", children: brandTitle || "Enterprise Portal" })
446
+ ] }),
334
447
  /* @__PURE__ */ jsxs("details", { className: "group relative", children: [
335
448
  /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 list-none", children: [
336
449
  /* @__PURE__ */ jsxs(
@@ -392,7 +505,7 @@ var TopNav = async ({
392
505
  ] })
393
506
  ] })
394
507
  ] }),
395
- /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-wrap gap-3 border-b border-gray-200 pb-2 text-sm font-medium text-gray-500", children: resolvedLinks.map(({ label, icon, href }) => {
508
+ /* @__PURE__ */ 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 }) => {
396
509
  const isActive = activeLabel === label;
397
510
  const className = `flex items-center gap-2 px-4 py-1 transition text-gray-500 ${isActive ? "underline underline-offset-8 decoration-2" : ""}`;
398
511
  if (href) {